热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新手问题:水仙花数

一个数的各个位上的数字的n次方的和等于它本身,这个数就叫水仙花数例如n3时,153,370就是两个符合条件的数,因为1531^3+5^3+3^3问题,输入n,输出符合条件的所有的解,比
一个数的各个位上的数字的n次方的和等于它本身,这个数就叫水仙花数
例如n=3时,153,370就是两个符合条件的数,因为153=1^3+5^3+3^3

问题,输入n,输出符合条件的所有的解,比如n=11时,有:
32164049650
32164049651
40028394225
42678290603
44708635679
49388550606
82693916578
94204591914
共8个解

这个题应该怎么做?
如果可以的话,大家写一下代码吧

96 个解决方案

#1


新手题目没有这么难吧。。。

#2


下面是三位数以内的...不知道你内多少位的,,自己改改吧.

#include "stdafx.h"
#include
#include
using namespace std;
int main(void) 
{
int i,j,k,n;
cout<<"water flower number is: ";

for(n=100;n<1000;n++)
{
i = n/100;
j = n/10%10;
k = n%10;

if(i*100+j*10+k == i*i*i + j*j*j + k*k*k)
{
cout<< n <

}
}
cout<
     return 0;
}

#3


打错个字..不知道你要多少位的.呵,不好意思!

#4


LZ发这么难的题分都不给..小气哦!

#5


提供一个输出从1~10000的所有水仙花数的方法:

#include 
#include 
using namespace std; 
/*****水仙花数是指一个n(n>=3)位数字的数,它等于每个数字的n次幂之和******/
bool isDaffodil(int num) 

if(num<1) 
return false; 

int weishu=1; 
int temp=num; 
while(temp/10 !=0) 

weishu++; 
temp/=10; 

if(weishu<3) 
return false; //位数小于2的肯定不是水仙花
int *factor=new int [weishu];//动态数组,存放num的每一位数 
temp=num; 
int sum=0; 
for(int i=0;i
factor[i]=temp%10; 
temp/=10; 
sum+=pow(factor[i],weishu); 

if(num==sum) 
return true; 
return false; 


int main() 

cout<<"1到10000的水仙花数为:"< for(int i=1;i<10000;i++) 

if(isDaffodil(i)) 

cout<

return 0;
}

#6


五楼的..可否解释一下...每行加点注释..有的小弟看不太懂

#7


问题,输入n,输出符合条件的所有的解,比如n=11时,有

----------------
按照lz的要求n随意,这个题目就有难度了,起码就要考虑大数的问题

#8


引用 6 楼 tengye19840704 的回复:
五楼的..可否解释一下...每行加点注释..有的小弟看不太懂


#include 
#include 
using namespace std; 
/*****判断一个数(num)是否为水仙花数。水仙花数是指一个n(n>=3)位数字的数,它等于每个数字的n次幂之和******/
bool isDaffodil(int num) 

    if(num<1) 
        return false;   //小于1的数就不讨论了

    int weishu=1;        
    int temp=num; 
    while(temp/10 !=0)  //计算num的位数,保存在weishu里
    { 
        weishu++; 
        temp/=10; 
    }      

    if(weishu<3) 
        return false;            //位数小于2的肯定不是水仙花
    int *factor=new int [weishu];//动态数组,存放num的每一位数 
    temp=num; 
    int sum=0; 
    for(int i=0;i     { 
        factor[i]=temp%10; 
        temp/=10; 
        sum+=pow(factor[i],weishu); 
    } 
    if(num==sum) //如果各个位的weishu次方之和等于num,那么该数就是水仙花数
        return true; 
    return false; 


/*********主函数就不用注释了吧。直接输出1-10000的水仙花数********/
int main() 

    cout<<"1到10000的水仙花数为:"<     for(int i=1;i<10000;i++) 
    { 
        if(isDaffodil(i)) 
        { 
            cout<         } 
    } 
    return 0;
}

#9


 sum+=pow(factor[i],weishu); 
主要是不懂这个是干嘛的..pow.

#10


8楼的你把你的代码试试改成计算当n=9的时候,有哪些解?
10位,11位呢?试过没?

#11


本来这个题目的思路还是比较简单的 
可是当n比较大的时候似乎很难了
如何计算i的n次方问题是关键了!
请高手来解答!

#12


i的n次方不难吧,循环n次自乘就可以了嘛

#13


计算i的n次方调用库函数pow(i,n)

#14


我在turboc 2.0下运行,
m不能输入太大了
unsigned long int 才32位

#15


经过别人的帮助,我这里有一段代码
我用的turboc 2.0编译的,从m=1,测试到8了,由于时间关系,没测试到你要的11,
你可以在你环境下测试看看,呵呵


unsigned long int power(int x,int y)     /*求指数函数*/
{
 unsigned long int z=1;
 while(y--)
  {
   z*=x;
  }
 return z;
}

main()
{
 int m;
 unsigned long int temp,n,p,x,q=0;

 printf("\nplease input the number m:\n");
 scanf("%d",&m);
 n=power(10,m-1);        /*m位整数,第一个数为n*/

 for(p=n;p<10*n;p++)     /*把n、10n作为数的边界*/
 {
   x=p;                  /*先把p的值赋给x,以便进行下面的循环*/
   while(x!=0)
    {
      temp=x%10;
      q+=power(temp,m);  /*把每一位数算指数后,相加*/
      x=x/10;            /*用x进行循环判断,不能用p本身进行循环*/
    }
  if(q==p)               /*判断*/
   printf("the result is %ld\n",p);  /*如果此次循环有满足条件的整数,输出*/
  q=0;                   /*把置0,以便进入下次for循环*/
 }
}

#16


引用 9 楼 tengye19840704 的回复:
sum+=pow(factor[i],weishu); 
主要是不懂这个是干嘛的..pow.

pow(i,n) 
计算i^n的库函数

#17


引用 15 楼 ysysbaobei 的回复:
经过别人的帮助,我这里有一段代码 
我用的turboc 2.0编译的,从m=1,测试到8了,由于时间关系,没测试到你要的11, 
你可以在你环境下测试看看,呵呵 


8位你的程序花了多少时间??

#18


 #include
using namespace std;
long chengji(int x, int y);
void main()
{
    int n,j,u=0,a;
 unsigned long i,d,t,l;
 cout<<"请输入你要的水仙花数的位数n:";
 cin>>n;
 cout<     l=chengji(10,n-1);
 for(i=l;i<10*l;i++)
 { 
  t=0;
  d=i;
  for(j=1;j<=n;j++)
  {
   a=d%10;
   t=t+chengji(a,n);
   d=d/10;
  }
  if(t==i)
  {
   cout<   }
 }

long chengji(int x,int y)
{
 long k,t=1;
 for(k=1;k<=y;k++)
  t*=x;
 return(t);
}


说实话,这个程序不太好,原因有两个:
一、unsigned long 的范围是0~4294967295
    所以在编写时,我不知道该怎样扩大整数范围。
     所以在你输入11时(11位数字),不能表示出来,只能表示10以内的数。
二、频繁的使用函数会使效率低下,这里就是这个问题,特别是输入6~9时。
我是一个刚学c++的,知道程序编写的不太好,不过还是想向各位高手请教一下!^^

#19


引用 17 楼 gLoli 的回复:
引用 15 楼 ysysbaobei 的回复:
经过别人的帮助,我这里有一段代码 
我用的turboc 2.0编译的,从m=1,测试到8了,由于时间关系,没测试到你要的11, 
你可以在你环境下测试看看,呵呵 
 

8位你的程序花了多少时间?? 


花了20分钟吧
8位数一共有1亿个哦

#20


你自己运行看看啊
我这个方式很直接,一个一个的找,看符合不

#21


n大小有限制

#22


引用 19 楼 ysysbaobei 的回复:
引用 17 楼 gLoli 的回复:

引用 15 楼 ysysbaobei 的回复: 
经过别人的帮助,我这里有一段代码 
我用的turboc 2.0编译的,从m=1,测试到8了,由于时间关系,没测试到你要的11, 
你可以在你环境下测试看看,呵呵 


8位你的程序花了多少时间?? 


花了20分钟吧 
8位数一共有1亿个哦


我希望能在0.01秒内找出全部解

#23


mark

#24


用LONG LONG格式计算

#25


引用 24 楼 frisky_lobo 的回复:
用LONG LONG格式计算

那样时间岂不是会很长?估计到十多位又溢出了。

#26


long long最高可以算17位的水仙花数
不过关键问题是,你需要花多少时间
正如楼上所说

假如像前面某人,8位数用20分钟,那么
10位数就要用2000分钟(或者更多),就是一天多
那11位是不是要15天??

#27


把n个位分配n个空间,用数组存放。不知道行不行。高手来试一下。
看过一个大数四则运算的程序,能对100位以内的数进行加减乘除。用的就是这种方法。

#28


引用 27 楼 elated 的回复:
把n个位分配n个空间,用数组存放。不知道行不行。高手来试一下。
看过一个大数四则运算的程序,能对100位以内的数进行加减乘除。用的就是这种方法。


这不是关键,11位都算一天还算不完的话,算更多的也就没意义了

#29


引用 22 楼 gLoli 的回复:
引用 19 楼 ysysbaobei 的回复:
引用 17 楼 gLoli 的回复: 

引用 15 楼 ysysbaobei 的回复: 
经过别人的帮助,我这里有一段代码 
我用的turboc 2.0编译的,从m=1,测试到8了,由于时间关系,没测试到你要的11, 
你可以在你环境下测试看看,呵呵 


8位你的程序花了多少时间?? 


花了20分钟吧 
8位数一共有1亿个哦 
 

我希望能在0.01秒内找出全部解


0.01 秒?

#30


没错,0.01秒,也就是8位9位时要瞬间算出结果

#31


你找到答案了,记得公布下啊

#32


我的程序可以1s内算出19位的全部解,但当然不代表我的就是答案,
我也想我的程序能运行得更快一些,我想找出n<60的全部解

#33


mark一下。

#34


大数运算 
再次关注!等高手来解决

#35


上面的各位己经写得够详细了。
你仔细看看就明白了

#36


引用 35 楼 Maron 的回复:
上面的各位己经写得够详细了。
你仔细看看就明白了


我就不明白了,目前这里没有一个人的程序或者算法能达得到我的要求
不如你写写吧,10次方以内要求0.01秒出解

#37


有难度

#38


引用 32 楼 gLoli 的回复:
我的程序可以1s内算出19位的全部解,但当然不代表我的就是答案, 
我也想我的程序能运行得更快一些,我想找出n <60的全部解

公布下你的答案啥,让我们见识下速度

#39


如果星期天也没有结果我就发

#40


揭贴率:0.00% 
汗一个先

#41


不怎么会...涉及算法和效率问题....
另...好象不是什么新手问题吧....呵呵
MARK下,等LZ的程序再说

#42


引用 40 楼 nihuajie05 的回复:
揭贴率:0.00%
汗一个先


到现在为止我只发了一个主题帖子

#43


应该说+不会是程序的瓶颈,相信问题主要是在POWER上面来的,特别是面对的是指数高的时候
本人是做JAVA的,最近转C,对效率问题考虑的并不是很多,但是我相信互相还是有借鉴的.
SUN 在做POWER的实现中,主要的算法是这样的,不知道能不能满足LZ的要求

int One=12;
int two=110;
int someting=1;
sometype    result=1;//之所以这样去做是因为我找不到合适的数据类型
int pow=9;
for(int index=0;index<32;index++)
{
if((someting&two)!=0)
   result=result*pow;
pow=pow*pow;
someting=2*someting;
}

基本思路就是这样了,希望LZ帮忙看下

#44


当然我只是凭印象自己写的,想想还可以这样
if((two&(somting||(someting-1)))==0)
break;
来减少循环次数,每次做POWER最多是32次的效果.



恩,就是这样了吧

#45


错了....
if((two&(someting-1))==0) 
break; 

这样才对

#46


引用 43 楼 nihuajie05 的回复:
应该说+不会是程序的瓶颈,相信问题主要是在POWER上面来的,特别是面对的是指数高的时候
本人是做JAVA的,最近转C,对效率问题考虑的并不是很多,但是我相信互相还是有借鉴的.
SUN 在做POWER的实现中,主要的算法是这样的,不知道能不能满足LZ的要求


瓶颈并不是在计算pow上面,因为只要做点手脚,就根本不需要计算pow

#47


这样啊。。。那你不如把思路说说,共同进步啊。。。
不然我们做这么多连你的程度都没有的话。。。哈哈,就搞笑了

#48


引用 47 楼 nihuajie05 的回复:
这样啊。。。那你不如把思路说说,共同进步啊。。。
不然我们做这么多连你的程度都没有的话。。。哈哈,就搞笑了


有什么好搞笑的?

#49


个人意见而已....仅仅是参考
如果POWER对你而言是可以避免的,我冒昧地问下,那么你面对的是增量问题吗?对于下一个水仙花数出现的预测问题?
比如我如何直接从153这个水仙花数得到下一个水仙花数的位置.

#50


引用 49 楼 nihuajie05 的回复:
个人意见而已....仅仅是参考
如果POWER对你而言是可以避免的,我冒昧地问下,那么你面对的是增量问题吗?对于下一个水仙花数出现的预测问题?
比如我如何直接从153这个水仙花数得到下一个水仙花数的位置.


不,从结果中我找不到任何有关联的地方,我只是穷举搜索

推荐阅读
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
北京城市环境监督主力军
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有