热门标签 | 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这个水仙花数得到下一个水仙花数的位置.


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

推荐阅读
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 给定行数 numRows,生成帕斯卡三角形的前 numRows 行。例如,当 numRows 为 5 时,返回的结果应为:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 本文详细介绍了如何使用 PHP 接收并处理微信支付的回调结果,确保支付通知能够被正确接收和响应。 ... [详细]
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社区 版权所有