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


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

推荐阅读
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 【数据结构】堆的实现(简单易懂,超级详细!!!)
    目录1、堆的概念及结构概念规律2、堆的实现2.1结构设计2.2接口实现2.3初始化2.4堆的向下调整算法主要思想涉及问题代码实现2.5建堆思想代码实现 ... [详细]
  • 本文探讨了如何高效地计算数组中和为2的幂的偶对数量,提供了从基础到优化的方法。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • 本文详细介绍了二叉堆的概念及其在Java中的实现方法。二叉堆是一种特殊的完全二叉树,具有堆性质,常用于实现优先队列。 ... [详细]
  • 使用C#构建动态图形界面时钟
    本篇文章将详细介绍如何利用C#语言开发一个具有动态显示功能的图形界面时钟。文章中不仅提供了详细的代码示例,还对可能出现的问题进行了深入分析,并给出了解决方案。 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • 探讨了在VB中使用WebBrowser控件时遇到的‘无法找到或打开C:\WINDOWS\system32\ieframe.dll’问题,并提供了解决方案。 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • 1#include2#defineM1000103#defineRGregister4#defineinf0x3f3f3f3f5usingnamespacestd;6boolrev ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 本文旨在探讨设计模式在Visual FoxPro (VFP) 中的应用可能性。虽然VFP作为一种支持面向对象编程(xbase语言)的工具,其OO特性相对简明,缺乏高级语言如Java、C++等提供的复杂特性,但设计模式作为一种通用的解决方案框架,是否能有效应用于VFP,值得深入研究。 ... [详细]
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社区 版权所有