| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖
标题:求一个好的解决方法!
只看楼主 加入收藏
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:12 
求一个好的解决方法!
1.编写一个程序,输出所有自然数之和为20的等式,要求,等式中的每个加数因子不能相同! 例如: 1+2+17=20;是合法的。而10+10就不合法!
搜索更多相关主题的帖子: 自然数 
2012-10-21 09:50
神之右手
Rank: 2
等 级:论坛游民
威 望:1
帖 子:40
专家分:79
注 册:2012-10-16
收藏
得分:2 
这个应该不难吧,就像数学里的分类讨论一样:当加数因子个数分别为2,3,4,5,6时,编写相应的实现语句!因为加数因子不能相同,所以最少2个因子(0+20=20),最多6个因子(如果是7个的话就超出范围了:0+1+2+3+4+5+6=21)!这当然是最笨的方法,应该还有更好的算法,这就有待于楼主的发掘了。。。。。

As I do,as you know!
2012-10-21 10:18
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
收藏
得分:4 
程序代码:
#include<stdio.h>
int a[100];
int qiuhe(int *q,int n)          //求和函数
{int i,he=0;
for(i=0;i<n;i++)
he+=q[i];
return he;

}
void zhonglei(int j,int k)
{int i,sum;
sum=qiuhe(a,j);
    if(20==sum&&j!=1)         //符合条件的输出
    {
    for(i=0;i<j;i++)
    {printf("%d",a[i]);
    if(i<j-1)
    printf("+");
    }
    printf("=20\n");
   
    }
    else
    {
        for(i=k;i<=20;i++)           //不回溯递归
        {
        a[j]=i;
        zhonglei(j+1,k+1);
        ++k;
        }
   
   
    }
}
void main()
{
zhonglei(0,0);
}
如有更好的算法希望指教

[qq]1402050187[/qq]
2012-10-21 14:53
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
收藏
得分:0 
回复 3楼 heishu
能写一下思路吗?

重剑无锋,大巧不工
2012-10-21 16:54
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
收藏
得分:0 
回复 4楼 lchpersonal
二楼已经给了基本的思路,但不需要分别为不同的因子个数写相应的程序,只要和为20就输出。
就像我们从0-20里任取n(n>1因为至少要2个数)个数,只要这n个数和为20,就输出。

[qq]1402050187[/qq]
2012-10-21 18:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:4 
问题没有新意,给你们展示一个有新意的解决方法,好好体会一下静态变量的用法。

程序代码:
#include<stdio.h>
#include<math.h>

void decompose(int n)
{
    static int *p, sn, deep = 0;
    int i;

    if(!deep)
    {
        if(n < 3) return;
        p = (int *)malloc(sqrt(n) * 2 * sizeof(int));
        sn = n;
    }

    if(!n)
    {
        if(deep <= 1) return;
        for(printf("%d", p[0]), i = 1; i < deep; printf("+%d", p[i++]));
        printf("=%d\n", sn);
        return;
    }

    for(i = deep ? p[deep - 1] + 1 : 1; i <= n; i++)
    {
        if(n - i <= i) i = n;
        p[deep++] = i;
        decompose(n - i);
        deep--;
    }
   
    if(!deep) free(p);
}

int main()
{
    int n;
    for(; printf("\nInput number (0 for exit): "), scanf("%d", &n), n; decompose(n));
    return 0;
}

重剑无锋,大巧不工
2012-10-21 20:47
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
收藏
得分:0 
回复 6楼 beyondyf
恩确实有新意和一般的解法不样;本人刚接触算法(c编程只是我的爱好),学习了
貌似少了个头文件#include<stdlib.h>

[qq]1402050187[/qq]
2012-10-21 21:57
神之右手
Rank: 2
等 级:论坛游民
威 望:1
帖 子:40
专家分:79
注 册:2012-10-16
收藏
得分:0 
    向3楼和6楼学习,虽然6楼的算法我没看明白,不过是高手就值得我们尊敬!
    还有,我第一次知道原来for循环还可以这样用:for(; printf("\nInput number (0 for exit): "), scanf("%d", &n), n; decompose(n));受教了,望多多指导!!!

As I do,as you know!
2012-10-21 22:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 7楼 heishu
哦,这是个习惯问题了,也许在你们的编译器上会有问题,但我用的是GCC,它内嵌了malloc函数,所以代码没有问题。事实上用GCC编译,删去那两个头文件仍然可以正确编译运行。

如果你用的是VC,那你可以试试下次不包含stdio.h看能不能用printf。

重剑无锋,大巧不工
2012-10-21 22:32
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
收藏
得分:0 
给出代码的高手们能不能在代码上写点注释呀,看别人的代码真的很痛苦。不过还是很谢谢,学习了

[ 本帖最后由 lchpersonal 于 2012-10-22 19:15 编辑 ]

重剑无锋,大巧不工
2012-10-22 19:07
快速回复:求一个好的解决方法!
数据加载中...
 
   



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

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