写在开头

与数字有关的程序

1. 四位反序数

设N是一个4位数,它的9倍恰好是其反序数,求N。(反序数即数字倒过来的形式:1234的反序数为4321)

思路:使用穷举法,将所有的四位数一一列出,然后把该四位数的每一位取出,乘以逆向以后的倍率,如果等于该数的9倍,则满足条件。

知识点:循环,分支,取模运算与除法运算结合得到每一位的数字。

#include <stdio.h>

int main(int argc, const char * argv[]) {

    for (int i = 1000; i < 9999; i ++) {

       if (i % 10 * 1000 + i / 10 % 10 * 100 + i / 100 % 10 * 10 + i / 1000 == i * 9) {

           printf("%d ", i);
       }
    }

    return 0;
}

2. 完全数

如果一个数恰好等于它的因子之和,则该数成为“完全数”,求1000以内的完全数。(如:6 = 1 + 2 + 3)。

思路:首先需要一层循环来穷举1~1000所有的数字,然后还需要一层循环来求出每一个的因子,然后将因子相加,若等于该数,则满足条件。

知识点:循环。

#include <stdio.h>

int main(int argc, const char * argv[]) {

    for (int i = 1; i <= 1000; i ++) {

        int sum = 0;

        for (int j = 1; j < i; j ++) {

            if (i % j == 0) {

                sum += j;
            }
        }
        if (sum == i) {

            printf("%d ", i);
        }
    }

    return 0;
}

3. 哥德巴赫猜想

任一大于2的偶数,都可表示成两个素数之和。请验证,该猜想在1000~1100成立。

思路:穷举法列出1000~1100之间的每一位数(注意循环步长为2,因为题目说明是偶数),然后使用一层循环从2开始,判断N = 2 + (N - 2)中2与(N-2)是否均为素数,然后判断N = 3 + (N - 3),以此类推,直到满足条件为止。

知识点:循环,自定义函数,素数。


#include <stdio.h>
#include <math.h>

/**
 *  判断是否是素数
 *
 *  @param number 需要进行判断的数字
 *
 *  @return 是否是素数  1:是  0:不是
 */
int isPrimeNumber(int number) {

    for (int i = 2; i <= sqrt(number); i ++) {

        if (number % i == 0) {

            return 0;
        }
    }
    return 1;
}

int main(int argc, const char * argv[]) {

    for (int i = 1000; i <= 1100; i += 2) {

        for (int j = 2; j <= i; j ++) {

            // 判断当前加数与被加数是否均为素数
            if (isPrimeNumber(j) && isPrimeNumber(i - j)) {

                // 输出其中一种情况
                printf("%d = %d + %d\n", i, j, i - j);
                break;
            }
        }
    }

    return 0;
}

4. 阶乘尾部0的个数

求1000!尾部有多少0?

思路:阶乘尾部0的来源无非是2 * 5,在一串连续数字中,2的个数肯定 > 5的个数,所以,直接找到1000内,5的个数就好。如1~10,有2个5,所以10!就有2个0。

int main(int argc, const char * argv[]) {

    int count = 0;

    for (int i = 1; i <= 1000; i ++) {

        int number = i;

        if (number % 5 != 0) {

            continue;
        }
        while (number >= 5) {

            if (number % 5 == 0) {

                count ++;
                number /= 5;
                continue;
            }
            break;
        }
    }

    printf("%d", count);

    return 0;
}