变态的算法题

发布于 2022-10-15 08:22:55 字数 411 浏览 22 评论 0

一个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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

淡淡绿茶香 2022-10-22 08:22:55

# 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;
}

灰色世界里的红玫瑰 2022-10-22 08:22:55

我错了  没看到后面的 程序的任务是:求N=21时

漫雪独思 2022-10-22 08:22:55

大数乘法和加法问题

请远离我 2022-10-22 08:22:55

这个肯定不能死算吧

少年亿悲伤 2022-10-22 08:22:55

感觉主要是时间问题吧

七七 2022-10-22 08:22:55

要先完成一个大数运算库。

深海少女心 2022-10-22 08:22:55

我的想法是凑数,8^21已经很小,
7^21已经很小,对于9^21大小都可以忽略.
9肯定是主流
但不能超过9个
于是可以从开始凑
1,2,3,4,5,6,7,8,9个9开始凑

油焖大侠 2022-10-22 08:22:55

可以把N=3那肯定是0-3之间,得到的结果,在是N=5之间,在是N=7之间,这个题可以用数学的的思维去想。

夜无邪 2022-10-22 08:22:55

本帖最后由 A.com 于 2011-04-28 17:52 编辑

其实就是0、1、2097152……9^21的组合,要求组合的和是个21位的数字且顺序符合。
先凑够数字,就是21个数之和大于10^20。然后是检测21个元素的集合和这个和的数字集合是否一致
程序需要循环21^21次。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文