题目:
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
C++版本:
#include <iostream>
#include <cmath>
#include <ctime>
int main()
{
int n;
std::cin >> n;
for(long long i=std::pow(10,n-1);i<=std::pow(10,n)-1;i++){
long long sum=0;
long long temp=i;
while(sum<=i && temp!=0){ // sum > i 不用判断了,加快程序速度
long long every=1;
int mod=temp % 10;
for(int j=1;j<=n;j++) every*=mod; // 位数的n次方
sum+=every; // 每一位求和
temp/=10;
}
if(sum==i){
std::cout << i << std::endl;
}
}
return 0;
}
结果:
总结:
以下是该代码的分析过程及思路总结:
-
输入:该程序从控制台接收一个整数n。
-
循环体的内容:
- 对于每个从
pow(10, n-1)
到pow(10, n)-1
的数i,执行以下步骤:- 初始化变量
sum
为0,用于存储数字i的每一位数字之和。 - 初始化变量
temp
为i,用于存储用于求和的数字。 - 在
sum
小于等于i且temp
不为0的情况下,执行以下步骤:- 初始化变量
every
为1,用于存储当前位的数值。 - 通过取模运算得到
temp
的最后一位数字。 - 对于每个位(从右到左的第n位开始),重复执行以下步骤:
- 将
every
乘以当前的位数值。
- 将
- 将
every
加到sum
上。 - 将
temp
除以10,去掉它的最后一位。
- 初始化变量
- 如果
sum
等于i,则打印出i。
- 初始化变量
- 对于每个从
-
输出:该程序将打印出所有满足条件的整数i,这些整数的每一位数字之和等于其本身。
思路总结:该程序是一个寻找特殊整数的小程序。它从指定的范围内找出满足特定条件的整数,这个条件是:一个整数的每一位数字之和等于这个整数本身。这种类型的整数通常被称为自恋数或阿姆斯特朗数。对于给定的位数n,所有这些特殊整数将被打印出来。总的来说题目并不难!