华山名的有趣传说:自然数的拆分问题

来源:百度文库 编辑:高校问答 时间:2024/05/11 02:24:12
自然数的拆分问题
【问题描述】 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入:待拆分的自然数n。
输出:若干数的加法式子。【样例输入】
7
【样例输出】
7=1+6
7=1+1+5
7=1+1+1+4
7=1+1+1+1+3
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
7=1+1+1+2+2
7=1+1+2+3
7=1+2+4
7=1+2+2+2
7=1+3+3
7=2+5
7=2+2+3
7=3+4

要什么语言的?
C的如下:
#include "stdio.h"
#define MAX 50
int p[MAX]; //每一次算出的组合存在这个数组里
int n;
int print(int num,int i)
{
int j;
int k;
int t;
if(num==0)
{
p[i]=0;
for(k=1;k<=n;k++)
if(p[k]!=0&&p[k]!=n)
printf(",%d",p[k]);
putchar('\n');
return ;
}
else
{
for(j=1;j<=num;j++)
{
p[i++]=j;
p[i]=print(num-j,i);
p[i--]=0;
}

}
}
main()
{

printf("请输入一个大于0的整数:\n");

n=7;
if(n<=0)
{
printf("请输入一个大于0的整数");
return;

}
else
print(n,1);
getch();
}

由于我手里没有queue.h这个文件,所以没把重复的给筛选出来,这个程序运行完了以后会出现重复的组合。我的想法是通过队列来解决,每算一个组合后判断一下是否在队列里有,如果没有的话就插入,有的话就继续运行程序,最后队列里存的是唯一列的组合了。
运行结果如下:
请输入一个大于0的整数:
7
,1,1,1,1,1,1,1
,1,1,1,1,1,2
,1,1,1,1,2,1
,1,1,1,1,3
,1,1,1,2,1,1
,1,1,1,2,2
,1,1,1,3,1
,1,1,1,4
,1,1,2,1,1,1
,1,1,2,1,2
,1,1,2,2,1
,1,1,2,3
,1,1,3,1,1
,1,1,3,2
,1,1,4,1
,1,1,5
,1,2,1,1,1,1
,1,2,1,1,2
,1,2,1,2,1
,1,2,1,3
,1,2,2,1,1
,1,2,2,2
,1,2,3,1
,1,2,4
,1,3,1,1,1
,1,3,1,2
,1,3,2,1
,1,3,3
,1,4,1,1
,1,4,2
,1,5,1
,1,6
,2,1,1,1,1,1
,2,1,1,1,2
,2,1,1,2,1
,2,1,1,3
,2,1,2,1,1
,2,1,2,2
,2,1,3,1
,2,1,4
,2,2,1,1,1
,2,2,1,2
,2,2,2,1
,2,2,3
,2,3,1,1
,2,3,2
,2,4,1
,2,5
,3,1,1,1,1
,3,1,1,2
,3,1,2,1
,3,1,3
,3,2,1,1
,3,2,2
,3,3,1
,3,4
,4,1,1,1
,4,1,2
,4,2,1
,4,3
,5,1,1
,5,2
,6,1

建议去pku,北大的ACM在线答题那里看看,那里很多牛人