首页 > 试题广场 >

输出水仙花数。输入一个正整数(3=n=7),输出所有的n

[问答题]

输出水仙花数。输入一个正整数(3<=n<=7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于他本身。试编写相应程序。

推荐
#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;
 } 
发表于 2018-05-06 21:25:08 回复(0)
#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;
}


发表于 2022-01-06 14:18:47 回复(0)
#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    int sum=0,a=0,min=1,max=1;
    for(int i=0;i<n-1;i++)
    min=min*10;
    for(int i=0;i<n;i++)
    max=max*10;
    max-=1;
    
    for(int i=min;i<=max;i++)
    {
        int num=i;
        sum=0;
        while(num>0)
        {
            sum+=pow(num%10,n);
            num=num/10;
        }
        if(i==sum)
        printf("%d ",i);
    }
}
发表于 2021-03-18 22:47:51 回复(1)
#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;      }      } 

发表于 2021-02-20 23:38:01 回复(0)