博文

[038] 小球反弹(2006-03-18 23:28:00)

摘要:<谭> 6.9 一球从100m高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时共经过多少m?  第10次反弹多高?

#include <stdio.h>
int   main()
{
    float an = 100 ;         /* 第一次落地前的高度 */
    float sn = an  ;         /* 第一次落地时总路程 */
    int i ;
    for ( i = 2; i <= 10; i++)
    {
        an = an / 2 ;
        sn = sn + an * 2 ;
    }
    printf("Sum=%fm\n",sn);
    printf("The tenth hight is: %fm\n",an / 2);
    return 0;
}

运行结果:
======================================
Sum=299.609375m
The tenth hight is: 0.097656m
======================================

★ 如此设计时绕了个小弯儿, 即第10次落地时的an为第9次反弹的高度, 因此在输出时又一次减半为an/2, 验证如下:

#include <stdi......

阅读全文(3123) | 评论:1

[037] 2/1,3/2,5/3,8/5,13/8,21/13,……(2006-03-12 23:15:00)

摘要:<谭> 6.8 有一分数序列: 2/1,3/2,5/3,8/5,13/8,21/13,…… 求出这个数列的前20项之和。

#include <stdio.h>
int   main()
{
    int i, cup, n = 20;
    float a = 2, b = 1, s = 0;
    for (i = 1; i <= n; i++)
    {
        s = s + a / b;
        cup = a;
        a = a + b;
        b = cup;
    }
    printf("sum=%9.6f\n", s);
    return 0;
}

运行结果:
============================
sum=32.660259
============================

★ 后项分子为前项分子分母之和, 分母为前项的分子。......

阅读全文(2872) | 评论:0

[036] 完数(2006-03-12 22:14:00)

摘要:<谭> 6.7 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程找出1000之内的所有完数,并按下面格式输出其因子:
6  Its factors are 1,2,3


#include <stdio.h>
const int M = 1000; /* 定义寻找范围 */
int   main()
{
    int k1, k2, k3, k4, k5, k6, k7, k8, k9, k10;
    int i, a, n, s;
    for (a = 2; a <= M; a++)
    {
        n = 0; /* n累计因子的个数 */
        s = a; /* s存放未求出的因子之和,初值为被测数本身 */
        for (i = 1; i < a; i++)
             if (a % i == 0)     /* 由i到a循环检测i是否为a的因子 */
            {
                n++;        ......

阅读全文(5828) | 评论:6

[035] 水仙花数(2006-03-12 19:46:00)

摘要:<谭> 6.6

打印出所有的"水仙花数", 所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。例如, 153就是一水仙花数,因为153 = 13+53+33 。

#include <stdio.h>
int main()
{
    int i, j, k; /* 分别表示百位,十位,个位 */
    int n;
    for (n = 100; n < 1000; n++)
    {
        i = n / 100;
        j = n / 10 - i * 10;
        k = n - i * 100 - j * 10;
        if (i*i*i + j*j*j + k*k*k == n)
            printf("%d ", n);
    }
    return 0;
}

运行结果:
======================
153 370 371 407
======================

######################################改进########################################

经网友指点,查了一下math.h中的pow函数

double pow(double a, double b)  即求 a 的 b ......

阅读全文(9198) | 评论:10

[034] 显示各种数据类型的长度(2006-03-12 16:42:00)

摘要:通过 sizeof (数据类型) 操作符可以确定某种数据类型的长度。 #include <stdio.h>
int main()
{
    printf("char   : %d byte\n", sizeof(char));
    printf("int    : %d byte\n", sizeof(int));
    printf("float  : %d byte\n", sizeof(float));
    printf("double : %d byte\n", sizeof(double));
    return 0;
}

TC下结果:
=========================
char   : 1 byte
int    : 2 byte
float  : 4 byte
double : 8 byte
=========================

VC下结果:
=========================
char   : 1 byte
int    : 4 byte
float  : 4 byte
double : 8 byte
=========================

★ 注意TC和VC下的数据类型的长度, 以及16位和32位的一些不同。环境的不同会影响如int这种数据类型的表示范围。......

阅读全文(3806) | 评论:1

[033] 阶乘->数据的范围(2006-03-12 16:10:00)

摘要:<谭> P120

6.4 求 1!+2!+3!+...+20!

#include <stdio.h>
int main()
{
    int t = 1; /* t表示各项值 */
    int s = 0; /* s表示各项和 */
    int i;
    for(i = 1; i <= 20; i++)
    {
        t = t * i;
        s = s + t;
    }
    printf("1!+2!+3!+...+20!=%d\n", s);
    return 0;
}

运行结果:
================================
1!+2!+3!+...+20!=268040729
================================

★ 那么这个结果是否正确呢, 首先将各项输出看一下


#include <stdio.h>
int main()
{
    int t = 1; /* t表示各项值 */
    int s = 0; /* s表示各项和 */
    int i;
    for(i = 1; i <= 20; i++)
    {
        t = t * i;
  &......

阅读全文(3885) | 评论:6

[032] 计算a+aa+aaa+...(2006-03-12 15:06:00)

摘要:<谭> 6.3 P120 求 Sn=a+aa+aaa+...+aa...a (n个)的值,其中a为一个数字,例如: 2+22+222+2222+22222(此时n=5), n由键盘输入

#include <stdio.h>
int main()
{
    int a, n;
    int tn = 0;  /* 第i个a组成的数 */
    int sn = 0;  /* 前i项多项式之和 */
    printf("Enter a, n \n");
    scanf("%d %d", &a, &n);
    for (int i = 1; i <= n; i++)
    {
        tn = tn + a;
        sn = sn + tn;
        a = a * 10;
    }
    printf("a+aa+aaa+...=%d\n", sn);
    return 0;
}

运行结果:
===================
Enter a, n
2 5↙
a+aa+aaa+...=24690
===================......

阅读全文(3896) | 评论:0

[031] 判断m是否是素数(2006-03-10 22:01:00)

摘要:<谭> 6.8 判断m是否是素数

    采用如下算法:让m被2到m^2除,如果m能被2~m^2之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即m^2);如果m不能被2~k(即m^2)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。

#include <stdio.h>
#include <math.h>
int main()
{
    int m, i, k;
    scanf("%d", &m);
    k = sqrt(m);     for (i = 2; i <= k; i++)
        if (m % i == 0) break;     if (i >= k + 1)
        printf("%d is a prime number\n", m);
    else
        printf("%d is not a prime number\n", m);     return 0;
}

★ 素数: 大于1,并且除1和它本身外没有其他因数的自然数叫素数(或质数) ,2是最小的素数,除2以外,所有的偶数都不是素数。
6.9 求100~200间的全部素数。

#include <stdio.h>
#include <math.h>
int main()
{
  &nb......

阅读全文(7797) | 评论:3

[030] Fibonacci数列与黄金分割(2006-03-09 22:11:00)

摘要:<谭> 6.7 求Fibonacci数列的前40个数。该数列有如下特点: 第1, 2两个数为1,1。从第3个数开始,每个数等于前2个数之和。
生成方法为:
F1=1                  (n=1)
F2=1                  (n=2)
Fn=Fn-1+Fn-2           (n>=3)
#include <stdio.h>

int main()
{
    long int f1, f2; /* 作为循环体的"前两项",会超过32767,所以用long */
    int i;           /* 计数 */
    f1 = 1; f2 = 1;
    for (i = 1; i <= 20; i++)          /* 循环一次输出2个,共进行20次 */
    {
        printf("%12ld %12ld", f1, f2); /* 第22个数之后值超过32767,必须用ld,而非d */
        if ( i % 2 == 0)&......

阅读全文(6078) | 评论:1

[029] 求π的近似值(2006-03-08 22:43:00)

摘要:<谭> 6.7 用 π / 4 ≈ 1 - 1/3 + 1/5 - 1/7 + ……公式求π 的近似值,直到最后一项的绝对值小于10-6为止。
#include <stdio.h>
#include <math.h>
int main()
{
    int s; 
    float n, t, pi;
    t = 1;                    /* 第一项为1       */
    pi = 0;                   /* 多项式的和      */
    n = 1.0;                  /* 各项分母        */
    s = 1;                    /* 控制各项正负    */
    while ......

阅读全文(4142) | 评论:1