求水仙花数的代码及几点理解
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1^3 +5^3 + 3^3
本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
#include <iostream>
#include <cmath>
using namespace std;
/*输入n
最外循环——挨个数比较
第二循环——将某个数拆分并幂加和
先求模,得到个位
最内局部循环
个位的幂
个位的幂加和
除10,弃个位,降低位数
与原数字比较*/
int main()
{
int n;
cin >> n;
for (int i = pow(10, n - 1); i < pow(10, n); i++)
{
int x = i;//临时的代替整数
int m = 0;//【个位的幂加和,注意是要每次循环清空的】
for (int j = 0; j < n; j++)
{
int y = x % 10;//得到的个位数
int a = 1;//个位的幂
for (int j = 0; j < n; j++)
a *= y;
m += a;
x /= 10;
}
if (m == i)
cout << i << endl;
}
return 0;
}
- 每个变量的声明位置有讲究。一般来说,不可以一股脑都在最前面声明,尤其是有循环的时候 。比如该题中的m,位置不能擅动,m在每次第二层循环结束是要清空的,如果放到第二层循环里面,就会导致一直累加,导致出错。
- 比较复杂的题,先写伪代码,拆分成小问题,再逐个击破。击破过程中切记之后要和整体结合的,不能没有联系的解决。
- pow()函数需要和返回的都是double类型,用的多了会导致莫名其妙的问题。
- 在求一系列累加累乘问题,可以直接用中间量接着算下一个,不用每次都算一遍。(阶乘的时候)