标题:求水仙花数
只看楼主
黑暗骑士5D
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2019-11-6
结帖率:100%
已结贴  问题点数:20 回复次数:8 
求水仙花数
水仙花数是指一个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;
}


我写的这个有啥问题?能修改一下吗
搜索更多相关主题的帖子: 输入 水仙花数 格式 pow 输出 
2019-12-05 22:58
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:5 
什么错误?
是你程序不贴完整,还是根本没学过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编辑过]

2019-12-06 10:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
#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 );
}
2019-12-06 12:11
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:5 
程序代码:
#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;
    }
2019-12-06 18:57
wangxinbozj
Rank: 2
等 级:论坛游民
威 望:2
帖 子:16
专家分:18
注 册:2019-12-1
得分:5 
a=e;改为e=a;就行
2019-12-06 21:29
黑暗骑士5D
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2019-11-6
得分:0 
回复 5楼 wangxinbozj
显示超时怎么办
2019-12-07 22:44
黑暗骑士5D
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2019-11-6
得分:0 
回复 2楼 bcbbcclbbc
改好之后显示超时怎么办
2019-12-08 19:21
黑暗骑士5D
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2019-11-6
得分:0 
回复 3楼 rjsp
有简化方法吗,我这个总是超时
2019-12-08 21:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用黑暗骑士5D在2019-12-8 21:26:06的发言:

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

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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-498235-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.693765 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved