注:水仙花数(Narcissistic number),它是指一个n位数(n≥3),其每个位上的数字的n次幂之和等于它本身。如153就是一个水仙花数,因为1^3 + 5^3 + 3^3 =153.同样地,1634也是一个水仙花数,因为1^4+6^4+3^4+4^4 =1634
题目:请设计一个程序,使用户输入一个N( N∈[3,7] ),就能求出N位数里所有的水仙花数。
示例:输入3,输出:153 370 371 407.
思路:根据输入的位数N,从最小的N位数开始递增,用index表示这个递增数,(如N=3时,index从100->999)。对每一个index,先逆序依次取index每一位上的数字,再立方运算并求和,最后与index本身比较。如果相等,输出index,使index+1,求和归零;如果不等,使index+1,求和归零。再重复上述操作,直到遍历并判断每一个N位数是否为水仙花数,跳出循环,输出结果。
#include <stdio.h>
#include <math.h>//用到一个函数pow,pow(a,b)是求a的b次方
//求3~7位数字的水仙花数
//思路:要根据输入的位数N,求出N位数字中所有的水仙花数,对于153,先取1 5 3,再分别作立方运算并求和,如果153 = 1^3 + 5^3 + 3^3 ,则这就是水仙花数
void main()
{
int digit = 0;//输入
int temp = 0;//中间变量
int temp2 = 0;//中间变量2
int index = 0;//递增数,三位递增数范围100->999
int sum = 0;//求和
printf("请输入一个正整数N,3<=N<=7:");
scanf_s("%d", &digit);
for(index = pow(10, (digit - 1));index <= pow(10, digit);index+=1)
{
temp2 = index;
//step1:对每一个index,先逆序依次取index每一位上的数字,再立方运算并求和,最后与index本身比较。如果相等,输出index;如果不等,index+1,重复step1
do
{
temp = temp2 % 10;//依次取最后一个数,如153,先取3给temp
sum = sum + pow(temp, digit);
temp2 = temp2 / 10;//丢去index的最后一位,如153,丢去3变成15赋给temp2
}while (temp2 > 0);
if (sum == index)
{
printf("%d\n", index);
}
sum = 0;
}
}