| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 997 人关注过本帖
标题:21 位花朵数,我求解的方法有问题,请求指点迷津
取消只看楼主 加入收藏
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
结帖率:50%
收藏
已结贴  问题点数:50 回复次数:7 
21 位花朵数,我求解的方法有问题,请求指点迷津
我先说一下我的算法思想,恳求大家帮帮看看出错出,我觉得是在major函数处,但又不知怎么错了。想法是这样的:首先得到1~9的21次方,然后枚举每一位出现的可能,即(1~9),总共有21位,但照我这样最后是不出现应打印出的花朵数。麻烦大家了。花朵数:(1的三次方+3的3次方+5的三次方=135),135就是三位数的花朵数
#include<stdio.h>
#include<stdlib.h>
//得到1~9的21次方
void multi(int a[21],int n){
int i,j;
int temp,nextemp;
for(i=1;i<=21;i++)
{
temp=0;
for(j=0;j<=20;j++)
{
nextemp=(a[j]*n+temp)/10;
a[j]=(a[j]*n+temp)%10;
temp=nextemp;
}
}   
}
//任意2个1~9的21次方相加
void add(int a[21],int b[21],int c[21]){
int temp,nextemp;
int i;
temp=0;
for(i=0;i<=20;i++)
{
nextemp=(a[i]+b[i]+temp)/10;
c[i]=(a[i]+b[i]+temp)%10;
temp=nextemp;
}
}
//判断temp是不是花朵数
int fanhui(int temp[21],int a[9][21]){
int ans[21]={0};   
int question[10]={0};   
int i,j;
for(i=0;i<=20;i++)
for(j=1;j<=9;j++)
if(temp[i]==j)
{
question[j]++;
break;
}
for(i=1;i<=9;i++)
for(j=question[i];j>0;j--)
add(ans,a[i-1],ans);
for(i=0;i<=20;i++)
{
if(ans[i]!=temp[i])
break;
}
if(i==21)
{
for(j=0;j<=20;j++)
printf("%d",temp[j]);
printf("\n");
}
}
//递归产生temp
void major(int n,int temp[21],int a[9][21]){
int come[21];
int i;
for(i=0;i<=20;i++)
come[i]=temp[i];
if(n==21) {
fanhui(temp,a);
return;
}
for(i=0;i<=8;i++)
{
add(temp,a[i],temp);
major(n+1,temp,a);
for(i=0;i<=20;i++)
temp[i]=come[i];
}
}
int main(){
int temp[21]={0};
int a[9][21]={0};
int i,j;
for(i=0;i<=8;i++)
a[i][0]=1;
for(i=0;i<=8;i++)
multi(a[i],i+1);
for(i=0;i<=8;i++)
{
for(j=20;j>=0;j--)
printf("%d",a[i][j]);
printf("\n");
}
major(1,temp,a);
return 0;
}
搜索更多相关主题的帖子: include 
2014-05-26 20:20
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
我用的是数组存的
2014-05-26 21:26
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
回复 6 楼 wp231957
亲,两个功能函数都不会有问题,我早已亲自测试过,至于后面的枚举,我也想到了,就是时间复杂度的问题,我写的程序可以运行,但不出花朵数,就这样
2014-05-27 20:18
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
回复 7 楼 wp231957
对不起,我算错了,不好意思,就那个意思
2014-05-27 20:21
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
回复 8 楼 Explorerlxz
谢谢,我觉得你的程序运行挺快的啊,麻烦您能解释一下主函数里while循环的意思嘛,我没看懂,还有我没接触过size_t,百度了一下还是有点迷糊,麻烦一并解释一下,佩服
2014-05-27 20:37
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
回复 13 楼 azzbcc
看到了,这个代码好强大,
2014-05-27 20:43
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
请问有人能解释一下为何我写的代码可以运行,但不出来应该有的打印结果呢?
2014-05-27 20:44
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
我知道哪错了,是毁在major函数里的return上了,不过这样枚举数确实很大,应借鉴各位的代码,总之,谢谢各位了
2014-05-27 21:32
快速回复:21 位花朵数,我求解的方法有问题,请求指点迷津
数据加载中...
 
   



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

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