本题来源浙大PAT题:输入一个正整数n(3<=n<=7),n为对应位数,输出所有对应的水仙花数。
水仙花数指一个n位正整数,每一位的立法和等于其本身,例如153,1^3+5^3+3^3=153,这就是水仙花数。
思路:
转换输入的n到对应位数最小值,从最小数开始遍历,构造循环取末位求立法,接着利用int类型的特性去掉末位得到新末位,再构造循环对各位立法求和,最后将最终和与此时遍历到的数进行比较,输出结果。
代码:
//水仙花数概念请自行百度,本代码可以求出所有值下的水仙花数
#include<stdio.h>
int main()
{
int n;
printf("input a number (at3~7)\n");
scanf("%d",&n);//键入n值,这里其实可以大于7,但遍历百万个数还是要花点时间的
int i=1,j;
for(j=1;j<n;j++)//本循环将输入的n值转换到对应位数初始值
{
i*=10;
}
int number=i;
for(number;number<i*10;number++)//本循环开始遍历n位数字起始值到末值
{
int s=number;
int sum=0;
int d;
do //下面通过对n位数进行拆分,取最后一位求立方再加入sum变量中
{
d=s%10;
s/=10;
int t,p=1;
for(t=0;t<n;t++)//本循环对求得末位d进行立法求和
{
p*=d;
}
sum+=p;
}while(s>0);
if(sum==number)//将sum和此时遍历到的三位数比较
{
printf("%d\n",sum);
}
}
return 0;
}