编写一个计算机程序,找出100-999之间的所有“水仙花数”,并打印运算结果.
(所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,
例如:153=1 3 ^3 3+5 3 ^3 3+3 3 ^3 3,故153是一个水仙花数)
输入一个正整数N(3<=N<=7)
输出格式:按递增顺序输出所有N位水仙花数,每个数字占一行
输入样例:
3
输出样例
153
370
371
407
/*编写一个计算机程序,找出100-999之间的所有“水仙花数”,并打印运算结果.
(所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,
例如:153=1^3+5^3+3^3,故153是一个水仙花数)
输入一个正整数N(3<=N<=7)
输出格式:按递增顺序输出所有N位水仙花数,每个数字占一行
输入样例:
3
输出样例
153
370
371*/
/*思路:循环100~999之间的所有数字,把三位数的每一位分解出来,然后计算每一位的幂次方
(由于c语言中无法直接多位数相乘,比如i*i*i这样,所以肯定要循环,乘几次就循环几次),相加求和,判断是不是等于该数*/
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);//a在3到7之间
//想办法让输入的数字扩大10^a,该题不一定就是三位数,循环
int k;
int first0=1;
for(k=1;k<a;k++){
first0=first0*10;
}
//测试一下first是不是正确的
// printf("%d\n",first0); //输出100
//---------------------------------------------------------------
int i;
//从100开始循环
for(i=first0;i<=first0*10-1;i++){
//记得把i给保存下来,因为在分解成三位数的时候会破坏i
int t=i;
int sum=0;
//取出三位数中的每一位
do{
int end=t%10;
t/=10;
//循环乘以每一位的幂次方
int j;
int ret=1;
for(j=1;j<=3;j++){
ret*=end;
}
//分解出来一位就累加,一直到分解完成,累加也就完成了
sum+=ret;
}while(t>0);
//加和,判断
if(sum==i){
printf("%d\n",i);
}
}
}