| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3434 人关注过本帖, 1 人收藏
标题:(C编程题)花朵数
只看楼主 加入收藏
flueky
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-12-25
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:26 
(C编程题)花朵数
     一个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分钟内运行完毕。
搜索更多相关主题的帖子: 编程 水仙花 十进制 正整数 
2011-12-25 16:58
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:3 
枚举这个21位数数中0-9分别有多少个,然后算出结果是否符合要求

时间复杂度分析:
等价于x0+x1+..x9=21,这个方程有C(30,9)个解,同时吧0-9的21次方预处理出来,这样时间复杂度大概就是O(判断时间*C(31,9)),我自己估计了一下,3分钟应该够了

[ 本帖最后由 czz5242199 于 2011-12-26 06:39 编辑 ]
2011-12-25 17:20
flueky
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-12-25
收藏
得分:0 
回复 2楼 czz5242199
有没有时间编一下??
2011-12-25 17:25
心灵百合
Rank: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:3 
依葫芦画瓢,跟求水仙花数没什么区别,只是数据类型要改变
2011-12-25 17:27
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 3楼 flueky
这个。你自己编呗。我明天有考试。。。超蛋疼的人体解剖生理学。。。意识都模糊了
2011-12-25 17:29
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
有意思,一会儿我试试。
人体解剖生理学?你学什么专业的?

重剑无锋,大巧不工
2011-12-25 17:41
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
药学。当初学校调的,学的真纠结
2011-12-25 17:45
flueky
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-12-25
收藏
得分:0 
回复 4楼 心灵百合
远超过长整形的范围了
2011-12-25 21:12
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
为考试积累rp好了,看得想吐了,花时间写了一个

N表示求N位的数,可以随便改,但注意check()函数里面的if (num[9]>9) return;是我专门为N=21加的优化,改数字的话注释掉这一行。

运行结果是
128468643043731391252
449177399146038697307

运行时间我没记,大概是在3min之内吧,还可以加一些优化,不过我得继续准备考试去了,考完再说吧

还有按顺序输出也没写,这些再看吧

程序代码:
#include <stdio.h>
#include <stdlib.h>
#define N 21

int power[10][N]={0},num[10]={0},ans[N+1],tmp[10];

void plus(int p)
{
     int i;
     for (i=0; i<N; i++)
     {
         ans[i]+=power[p][i];
         if (ans[i]>=10)
         {
                       ans[i+1]+=ans[i]/10;
                       ans[i]%=10;
         }
     }
}

void check()
{
     if (num[9]>9) return;
     memset(ans,0,sizeof(ans));
     memset(tmp,0,sizeof(tmp));
     int i,j;
     for (i=0; i<10; i++)
       for (j=0; j<num[i]; j++)  plus(i);
     if (ans[N-1]==0) return;
     if (ans[N]>0) return;
     for (i=0; i<N; i++)
     {
         tmp[ans[i]]++;
         if (tmp[ans[i]]>num[ans[i]]) return;
     }
     for (i=N-1; i>=0; i--) printf("%d",ans[i]);
     printf("\n");
}

void dfs(int dep,int re)
{
     if (re==0)
     {
               check();
               return;
     }
     if (dep==9)
     {
                num[9]=re;
                check();
                num[9]=0;
                return;
     }
     int i;
     for (i=0; i<=re; i++)
     {
         num[dep]=i; dfs(dep+1,re-i); num[dep]=0;
     }
}

int main()
{
    int i,j,k;
    for (i=1; i<10; i++)
    {
        power[i][0]=1;
        for (j=0; j<N; j++)
        {
            for (k=0; k<N; k++) power[i][k]=power[i][k]*i;
            for (k=0; k<N; k++)
                if (power[i][k]>9)
                {
                                     power[i][k+1]+=power[i][k]/10;
                                     power[i][k]%=10;
                }
        }
    }
    dfs(0,N);
    
    return 0;
}
    
            


[ 本帖最后由 czz5242199 于 2011-12-26 06:08 编辑 ]
2011-12-25 22:31
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:3 
程序代码:
void dfs(int dep,int re)
{
     if (re==0)
     {
               check();
               return;
     }
     if (dep==9)
     {
                num[9]=re;
                check();
                num[9]=0;
                return;
     }
     int i;
     for (i=0; i<=re; i++)
     {
         num[dep]=i; dfs(dep+1,re-i); num[dep]=0;
     }
}
这是在打印C(21,9)吧

                                         
===========深入<----------------->浅出============
2011-12-25 23:09
快速回复:(C编程题)花朵数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024422 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved