输出水仙花数。输入一个正整数(3<=n<=7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于他本身。试编写相应程序。
#include<stdio.h>
#include<math.h>
int main(){
int i,n,j,temp;
/* i:对n位数进行遍历;
n:n位数;
j:控制n位数的各个位的n次幂
item:每一位的 n次幂的和,如 1^3 + 5^3 + 3^3
*/
double item;
/* temp:暂存变量i,如153;防止后续的操作改变i值,从而无法判断i是否为水仙花数
使用double类型的原因:
math.h中的pow()返回值为double型;用int型存储会出现问题,例如n=3时解不全面
*/
printf("input n : ");
scanf("%d",&n);
if(n>=3&&n<=7){
/*
对n位数 10..00 ~ 99..99 遍历找出其中的水仙花数;
例如n=3,pow(10,n-1) == 100,pow(10,n) == 1000 ,则循环在100~999进行
*/
for(i=pow(10,n-1);i<pow(10,n);i++){
temp = i; //暂存n位数 i 的值
j = n; //控制逐位操作的次数
item = 0; //各个位的n次幂的和,如 1^3 + 5^3 + 3^3;
//需要对每个n位数进行判断,所以每次循环都要清零
//将各个位的n次幂相加
while(j>0){
item += pow(temp%10,n); //每次取出最低位,计算其n次幂,如153%10 == 3,3^3
temp /= 10; //将暂存的数除以10,即去除最低位,如153 -> 15
j--;
}
if(item == i) //判断是否为水仙花数
printf("%d is a daffodil number \n",i);
}
}else{
printf("invalid value\n");
}
return 0;
}
#include <stdio.h> #include<math.h> #include <string.h> #include<stdlib.h> int main() { int n,a,b,c,d,e,f,g; double m; int h; char str[8]; while(scanf("%d",&n)&&n!=0&&n>=100&&n<=99999999) { itoa(n,str,10); h=strlen(str); a=(n/1000000)%10; b=(n/100000)%10; c=(n/10000)%10; d=(n/1000)%10; e=(n/100)%10; f=(n/10)%10; g=n%10; m=pow(a,h)+pow(b,h)+pow(c,h)+pow(d,h)+pow(e,h)+pow(f,h)+pow(g,h); if(m==n) printf("%d\n",n); else return 0; } }
#include<stdio.h> int power(int x,int y) //不要用pow当函数名,因为math.h里有pow的系统函数,会有歧义 { int i=1, a=1; while(i<=y) { a = a * x; i++; } return a; } int main(void) { int i,h,n,s,m=0,b; printf("输入n位数字(3<=n<=7)"); scanf("%d",&n); for(s=power(10,n-1);s<power(10,n);s++) { b=s; //循环不要改变s的值,因为最后还要s++ //之前的程序改变了s的值,所以执行完100的判断后,s=1,没法继续下面的 m = 0; //m每累加完一个数的记得清零 for(i=1;i<=n;i++) { h=b%10; //每次改变b的值 m=m+power(h,n); b=b/10; } if(m==s) printf("%d\n",m); //用s去比较 } return 0; }