页码
程 序
64 逐个检查1到200的所有整数,求1到200之间的完全平方数
65 利用sqrt求1到200之间的完全平方数
65 利用sqrt求1到200之间的完全平方数的改进程序
65 从1开始逐个打印计数变量值的平方,求1到200之间的完全平方数
66 判断一个整数是否为素数
67 利用迭代公式求立方根
67 利用迭代公式求立方根的改进程序
68 求Fibonacci数
69 计算过程计时
70 用迭代方式计算Fibonacci序列
71 关于调和级数{1/n}的计算
73 从1开始逐个递增求最大公约数
73 从某个大数开始逐个递减求最大公约数
74 利用欧几里德算法,求最大公约数
75 利用欧几里德算法和循环结构,求最大公约数
75 求6到200之间的每个偶数的素数分解
80 由输入得到的一个字符输出,并换一行
81 由标准输入读一行字符,输出各个字符的编码
83 读入内容并标准输出,直到文件结束
83 统计由标准输入得到的文件中字符的个数
85 读入一系列数值,把每个数据作为一个圆盘的半径,分别计算出每个圆盘的面积
85 统计输入数据的个数,找出其中的最小值和最大值
88 分别统计输入文件中的空格、行、数字、花括号以及其他所有字符
91 统计文件中词的个数
返回 总目录
例:逐个检查1到200的所有整数,求1到200之间的完全平方数

#include <stdio.h>
main () {
    int m, n;
    for (n = 1; n <= 200; n++)
        for (m = 1; m * m <= n; m++)
            if (m * m == n)
                printf("%d ", n);
    printf("\n"); /* 最后换一行 */
}

例:利用sqrt求1到200之间的完全平方数
 
for (n = 1; n <= 200; n++)
    if ((int)sqrt(n) * (int)sqrt(n) == n)
        printf("%d ", n);
 
例:利用sqrt求1到200之间的完全平方数的改进程序

for (n = 1; n <= 200; n++) {
    m = (int)sqrt(n);
    if (m * m == n)
        printf("%d ", n);
}

例:利用从1开始逐个打印计数变量值的平方,求1到200之间的完全平方数

for (n = 1; n * n <= 200; n++)
    printf("%d ", n * n); /* 注意应当打印什么 */

例:判断一个整数是否为素数

int primeQ (int n) { /* 判断一个数是否素数 */
    int m = 2;
    for ( ; m * m <= n; m++)
        if (n % m == 0) return 0; /* 发现因子,不是素数 */
    return 1; /* 可能性均考虑过,没有因子,是素数 */
}

例:利用迭代公式求立方根

double cbrt(double x){
    double x1, x2;
    x1 = x;
    x2 = (2.0 * x1 + x / (x1 * x1)) / 3.0;
    while (fabs((x2 - x1) / x1) >= 1E-6) {
        x1 = x2;
        x2 = (2.0 * x1 + x / (x1 * x1)) / 3.0;
    }
    return x2;
}

例:利用迭代公式求立方根的改进程序

double cbrt(double x){
double x1, x2;
if (x == 0.0) return 0.0;
for (x1 = x;
     x2 = (2.0 * x1 + x / (x1 * x1)) / 3,
     fabs((x2 - x1)/x1) >= 1E-6;
    )
   x1 = x2;
   return x2;
}

例:求Fibonacci数

long fib (int n) {
    return n < 2 ? 1 : fib(n-1) + fib(n-2);
}

例:计算过程计时

#include <stdio.h>
#include <time.h>

long fib (int n) {
    return n <= 1 ? 1 : fib(n-1) + fib(n-2);
}
main () {
    double x;
    x = clock() / CLOCKS_PER_SEC;
    fib(33);
    x = clock() / CLOCKS_PER_SEC - x;
    printf("Timing fib(33): %f\n", x);
}

例:用迭代方式计算Fibonacci序列

long fib1 (int n) {
    long f1 = 1, f2 = 1, f3, i;
    if (n <= 1) return 1;
    for (f3 = f1 + f2, i = 2; i < n; i++) {
        f1 = f2;
        f2 = f3;
        f3 = f1 + f2;
    }
    return f3;
}

例:关于调和级数{1/n}的计算

#include <stdio.h>

long count (double m) {
    long n;
    double sum = 0.0;
    for (n = 0; sum <= m; n++)
        sum += 1.0 / n;
    return n;
}

main () {
    printf("Sum of %ld terms exceeds %f\n",
    count(100.0), 100.0);
    printf("Sum of %ld terms exceeds %f\n",
    count(200.0), 200.0);
    printf("Sum of %ld terms exceeds %f\n",
    count(1000.0), 1000.0);
}

例:从1开始逐个递增求最大公约数
 
long gcd (long m, long n) {
    long d = 1, k = 2;
    for ( ; k <= m && k <= n; k++)
        if (m % k == 0 && n % k == 0)
            d = k;
    return d;
}

例:从某个大数开始逐个递减求最大公约数

for ( k = (m > n ? n : m);
      m % k != 0 || n % k != 0; k--)
    ; /* 空循环体 */
return k; /* 循环结束时,k总是最大公约数 */

例:利用欧几里德算法,即辗转相除法求最大公约数

long gcd(long m, long n) {
    if (m < 0) m = -m;
    if (n < 0) n = -n;
    return n == 0 ? m : gcd1(m, n);
}

例:利用欧几里德算法和循环结构,求最大公约数

long gcd2 (long m, long n) {
    long r;
    if (n == 0) return m;
    for (r = m % n; r != 0; r = m % n) {
        m = n;
        n = r;
    }
    return n;
}

例:求 6 到 200 之间的每个偶数的素数分解

for (n = 6; n <= 200; n += 2)
    for (m = 3; m <= n/2; m+= 2)
        if (primeQ(m) && primeQ(n - m))
            printf("%d = %d + %d\n", n, m, n-m);
 
例:由输入得到的一个字符输出,并换一行

#include <stdio.h>

main () {
    int c;
    c = getchar();
    putchar(c);
    putchar('\n');
}

例:由标准输入读一行字符,输出各个字符的编码

#include <stdio.h>

main () {
    int c;
    do {
        c = getchar();
        printf("%d ", c);
    } while (c != '\n');
}

例:读入内容并标准输出,直到文件结束

#include <stdio.h>

main () {
    int c = getchar();
    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}
 
例:统计由标准输入得到的文件中字符的个数

#include <stdio.h>

main () {
    int c; long n = 0;
    while ((c = getchar()) != EOF)
        n++;
    printf("%ld\n", n);
}

例:读入一系列数值,把每个数据作为一个圆盘的半径,分别计算出每个圆盘的面积
 

#include <stdio.h>

void pc_area (double r) {
    printf ("r = %f, S = %f\n", r, 3.14159265 * r * r);
}

main () {
    double x;
    while (scanf("%lf", &x) == 1)
        if (x < 0)
             printf("Input error: %lf\n", x);
        else
            pc_area(x);
}

例:统计输入数据的个数,找出其中的最小值和最大值

#include <stdio.h>

main () {
    double sum = 0.0, biggest, smallest, x;
    int count = 1;
    scanf("%lf", &sum);
    biggest = smallest = sum;
    while (scanf("%lf", &x) == 1) {
        sum += x;
        count++;
        if (x > biggest) biggest = x;
        if (x < smallest) smallest = x;
    }
    printf("Count of numbers: %d\n", count);
    printf("Biggest: %lf, Smallest: %lf, Average: %lf\n",
           biggest, smallest, sum / count);
}

例:分别统计输入文件中的空格、行、数字、花括号以及其他所有字符
 
#include <stdio.h>

main (void) {
    int c;
    int nd = 0, nb = 0, nl = 0, nc = 0, nn = 0; /*5个计数器*/
    while ((c = getchar()) != EOF)
    switch (c) {
    case ' ':
        nb++; break;
    case '1': case '2': case '3': case '4': case '5':
    case '6': case '7': case '8': case '9': case '0':
        nd++; break;
    case '\n':
        nl++; break;
    case '{':
    case '}':
        nc++; break;
    default:
        nn++; break;
    }
    printf("spaces: %d, lines: %d, digits: %d", nb, nl, nd);
    printf("{ and }: %d, others: %d\n", nc, nn);
}

例:统计文件中词的个数

#define OUT 0

main (void) {
    int c, count = 0, state = OUT;
    while ((c = getchar()) != EOF)
        if (c == ' ' || c == '\t' || c == '\n')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            count++;
        }
    printf("word count: %d\n", count);
}