水仙花数
是指一个n位数,其各位数字的n次幂之和等于该数本身。
也就是说如果我们需要求出所有的水仙花数,也就需要知道数字的每一位是什么,并且将它们都提取出来再以n次幂的形式相加,要求结果等于该数本身。
我们设定为三位数,因为位数过高编译器会受不了(bushi)
那么三位数也就需要知道个位十位百位的数字分别是多少。
在这里我们运用模10除10法将每个位数提取出来:
while (num != 0)
{
digit = num % 10;
sum += digit * digit * digit;
num /= 10;
}
该while循环将遍历所有的三位数(100 到 999),计算每个数的各位数字的立方和。
我们将它们打印出来即可。
#include <stdio.h>
int main()
{
int num, sum, digit;
printf("所有的三位水仙花数为:\n");
for (int i = 100; i < 1000; i++) {
num = i;
sum = 0;
while (num != 0) {
digit = num % 10;
sum += digit * digit * digit;
num /= 10;
}
if (sum == i)
{
printf("%d\n", i);
}
}
return 0;
}
原理
这是一个很简单的算法题。但是我们从中能发现一个很常见的公式或者说是定律:
模10除10
它的作用是求出位上的数字。
那么它的原理是什么呢?
我们都知道,
模除运算(取模运算)通常用符号 "%" 表示,在数学中,它表示取两个数相除的余数。当你对一个数进行模 10 运算(即取模 10),实际上是在找到这个数除以 10 的余数。这个运算可以帮助提取给定数字的个位数。
举个例子,如果我们有一个数 365,对它进行模 10 运算:
365 % 10 = 5
这里,结果中的余数 5 就是原始数字 365 的个位数。
因此,模 10 运算能够帮助我们提取整数中的个位数字,因为它返回的余数就是这个数字的个位数。
而这仅仅只能帮我们求出个位数,假设我们需要每一位数呢?
在C语言除法运算中,我们假设某个数a,
a/10=以a的倒数第二数为个位的数
举个例子:
365 / 10 =36
这里,结果中的36就是原先百位数365的后两位数组成的一个十位数。
而在循环中
模10运算与除10运算的结合使用能够帮助我们获得每一位上的数字。
这就是"模10余10法"。