首页 > 编程笔记 > C语言笔记

C语言求自守数(有源码有解析)

自守数是一个非常有趣的数学概念,它指的是一个数的平方的尾数等于这个数本身。换句话说,如果一个数的平方的末尾几位数字与这个数本身相同,那么这个数就是自守数。


举几个例子来说明:

现在我们理解了自守数的概念,让我们来探讨如何用C语言来找出自守数。我们的思路是:遍历一定范围内的数字,对每个数字,我们计算它的平方,然后比较这个平方的末尾几位是否和原数相同。如果相同,那么这个数就是自守数。
 

具体的实现步骤如下:


下面是实现这个思路的C语言代码:

#include <stdio.h>

int main() {
    int n = 10000; // 我们要找到 1 到 10000 之间的自守数
    long long square;
    int length, mod;

    printf("1 到 %d 之间的自守数有:\n", n);

    for (int i = 1; i <= n; i++) {
        square = (long long)i * i; // 计算平方
        length = 1;
        mod = 10;

        // 计算 i 的位数
        while (i >= mod) {
            length++;
            mod *= 10;
        }

        // 检查是否为自守数
        if (square % mod == i) {
            printf("%d\n", i);
        }
    }

    return 0;
}

这段代码的核心在于如何判断一个数是否为自守数。我们使用了一个巧妙的方法:首先计算出这个数的位数(存储在 length 变量中),然后用 10 的 length 次方作为除数进行模运算。这样就可以得到平方数的末尾 length 位数字,再与原数比较,如果相等,就说明这个数是自守数。
 

代码中使用了 long long 类型来存储平方结果,这是为了防止在计算较大数的平方时发生整数溢出。同时,我们用一个循环来计算每个数的位数,这个方法虽然不是最高效的,但对于初学者来说更容易理解。


运行这段代码,你会得到如下输出结果:

1 到 10000 之间的自守数有:
1
5
6
25
76
376
625
9376

这个程序成功地找出了 1 到 10000 之间的所有自守数。你可以通过修改 n 的值来寻找更大范围内的自守数。不过要注意,随着范围的扩大,程序的运行时间也会相应增加。
 

理解和实现自守数的查找不仅能帮助你更好地掌握C语言的基本语法和数学运算,还能锻炼你的逻辑思维能力。你可以尝试优化这个程序,比如使用更高效的方法来计算数字的位数,或者使用更大的数据类型来处理更大范围的数。这些尝试都将帮助你进一步提升编程技能。

相关文章