变态的算法题
一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。
程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
# include <stdio.h>
# include <math.h>
int IsYes(int goal, int len)
{
int i = 0, sum = 0, goal1=goal;
int * pArr;
pArr = (int)malloc(sizeof(int) * len);
while(goal > 10)
{
pArr[i] = goal % 10;
i++;
goal /= 10;
}
pArr[i] = goal;
for(i=0; i<len; i++)
{
sum += pow(pArr[i], len);
}
if(sum == goal1)return 1;
else return 0;
}
int main(void)
{
int len = 3, i = 0;
int LBound = 0, UBound = 0;
scanf("%d", &len);
LBound = pow(10, len-1);
UBound = pow(10, len);
for(i=LBound; i<UBound; i++)
{
if( IsYes(i, len) )printf("%d\n", i);
}
return 0;
}
我错了 没看到后面的 程序的任务是:求N=21时
大数乘法和加法问题
这个肯定不能死算吧
感觉主要是时间问题吧
要先完成一个大数运算库。
我的想法是凑数,8^21已经很小,
7^21已经很小,对于9^21大小都可以忽略.
9肯定是主流
但不能超过9个
于是可以从开始凑
1,2,3,4,5,6,7,8,9个9开始凑
可以把N=3那肯定是0-3之间,得到的结果,在是N=5之间,在是N=7之间,这个题可以用数学的的思维去想。
本帖最后由 A.com 于 2011-04-28 17:52 编辑
其实就是0、1、2097152……9^21的组合,要求组合的和是个21位的数字且顺序符合。
先凑够数字,就是21个数之和大于10^20。然后是检测21个元素的集合和这个和的数字集合是否一致
程序需要循环21^21次。。。