注册 登录
编程论坛 C语言论坛

求水仙花数

黑暗骑士5D 发布于 2019-12-05 22:58, 2726 次点击
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
​3
​​ +5
​3
​​ +3
​3
​​ 。 本题要求编写程序,计算所有N位水仙花数。

输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:
3
输出样例:
153
370
371
407

int main()
{
  int a,b,c=0,e,i;
  double N;
  scanf("%lf",&N);
  a=pow(10,N-1);
  b=pow(10,N);
  for(;a<b;a++)
  {
    a=e;
    for(i=N;i>0;i--)
    {
      c+=pow(e%10,N);
      e=e/10;
    }
    if(c==a)
      printf("%d\n",a);
      c=0;
  }
   return 0;
}


我写的这个有啥问题?能修改一下吗
8 回复
#2
bcbbcclbbc2019-12-06 10:46
什么错误?
是你程序不贴完整,还是根本没学过c语言,包含的头文件有哪些不写清楚,编译器怎么给你编译???
int main()
{
  int a,b,c=0,e,i;
  double N;    //N的值是正整数,为何定义为double?
  scanf("%lf",&N);
  a=pow(10,N-1);     //int类型不一定能够处理7位数的水仙数,可以用long长整数型
  b=pow(10,N);
  for(;a<b;a++)
  {
    a=e;//这里有问题。编代码,除了会写,还要对代码改错,调试。
    //c=0;              
    for(i=N;i>0;i--)
    {
      c+=pow(e%10,N);
      e=e/10;
    }
    if(c==a)
      printf("%d\n",a);
      c=0;
  }
   return 0;
}


[此贴子已经被作者于2019-12-6 10:59编辑过]

#3
rjsp2019-12-06 12:11
#include <stdio.h>

void foo( unsigned n )
{
    unsigned pown[11];
    for( unsigned i=0; i!=11; ++i )
    {
        pown[i] = 1;
        for( unsigned j=0; j!=n; ++j )
            pown[i] *= i;
    }

    for( unsigned i=pown[10]/10; i!=pown[10]; ++i )
    {
        unsigned sum = 0;
        for( unsigned j=i; j!=0; j/=10 )
            sum += pown[j%10];

        if( sum == i )
            printf( "%u\n", i );
    }
}

int main( void )
{
    foo( 7 );
}
#4
自学的数学2019-12-06 18:57
程序代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    double N;            //把N从int型定义成double型,因为pow()函数不支持int类型,当然,N是int型也可以,用的时候强制转换也行,但是太烦。
    int a,t;
    int i=0,s=0;
    scanf("%lf",&N);      //N是double型了,那么赋值就要用%lf啦
    a=pow(10,N-1);
    t=a;
    while(N>=3&&N<=7){
        while(pow(10,N-1)<=a&&pow(10,N)>=a){
            t=a;
            while(i<N){
                s=s+pow(t%10,N);
                t/=10;
                i++;
            }
            i=0;
            if(a==s){
                printf("%d\n",a);
            }
            a++;
            s=0;
        }
        break;               //在这边添加一个break,不然你是退不出去的,陷入了死循环
    }
    system("pause");
    return 0;
    }
#5
wangxinbozj2019-12-06 21:29
a=e;改为e=a;就行
#6
黑暗骑士5D2019-12-07 22:44
回复 5楼 wangxinbozj
显示超时怎么办
#7
黑暗骑士5D2019-12-08 19:21
回复 2楼 bcbbcclbbc
改好之后显示超时怎么办
#8
黑暗骑士5D2019-12-08 21:26
回复 3楼 rjsp
有简化方法吗,我这个总是超时
#9
rjsp2019-12-08 21:45
以下是引用黑暗骑士5D在2019-12-8 21:26:06的发言:

有简化方法吗,我这个总是超时

你的代码超时,那你可以试试我到代码呀
如果我的代码也超时,有一种快速算法,很久前写过,思路是: a个1,b个2,c个3,……。缺点是最后多一步排序。
如果依然超时,那你先将所有结果算出来,直接硬编码到代码中。当然,这也许算作弊了
1