响扇舞精忠报国丨9教学:可以把一个自然数分解成若干个自然数之和

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 02:28:20
可以把一个自然数分解成若干个自然数之和
如N=3 有:3=1+1+1
=1+2
共2种分解方案(注:1+2与2+1算同一种分法)
输入 N,输出分解种数及具体方案.
如输入 N=3;
输出 TOTAL=2
用pascal

pascal
搜索算法
枚举思想
n<=100
program chaifen;
var
n,m,p,i:longint;
a:array[0..120]of integer;
procedure find(v:integer);
var
k:integer;
begin
for k:=a[v-1] to n div 2 do begin
n:=n-k; a[v]:=k;
find(v+1);
n:=n+k; end;
inc(m);
if v<>1 then begin
write(p,'=');
for i:=1 to v-1 do write(a[i],'+');
writeln(n); end;
end;
begin
readln(n);
a[0]:=1;
p:=n;
assign(output,'ChaiFen.txt');
rewrite(output);
find(1);
writeln('TOTAL=',m-1);
close(output);
end.

屏幕读入N

文件输出
输出目录为pascal运行文件夹
文件名称为ChaiFen.txt
输出格式:
列出所有等式 每行一个
输出Total=。。

速度远没有只输出Total快

N<60有什么不明白的
给我的邮箱发信。(资料里有)

写一个程序,让后面的加数总是小于等于前面的加数(保证不重复),并且判断和为N即可。也不知道你要用什么语言

如何求出所有拆分.
下面分析拆分过程:
取n=7来说明:
第一步:将n拆分为2项之和
7=1+6,
7=2+5,
7=3+4,
拆分的特点是第2个加数总大于等于第1个加数,因此第一个加数从1变化到n div 2(n/2的整数部分);
第二步:只要第2个加数仍大于1,就可按第一步重复拆分,例如:
7=1+6
7=1+1+5
7=1+2+4
7=1+3+3
其中7=1+1+5 又可继续拆分获得
7=1+1+1+4
7=1+1+2+3
……….
最后获得如下结果(共14种拆分方法)
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
算法实现:用数组a[0..100](这时假设操作中输入的n≤100),a[k]中存贮已完成的一种拆分.
例如: 7=1+6
表示为a[0]=7,a[1]=1,a[2]=6,k=2,继续拆分从a[k](即a[2]开始);a[k]能否再拆分取决于a[k] div 2是否大于等于a[k-1];递归过程有两个参数:nx表示要拆分的数值大小,kx表示nx存贮在数组元素a[kx]中,即a[kx]=nx.
下面是该算法的实现清单:

在VC++6.0下编译通过

#include "stdafx.h"

int SplitNumber(int n, int* a);
int Sum(int kx, int* a);

int main(int argc, char* argv[])
{
int a[1000];

printf("total = %d\n", SplitNumber(2, a));

return 0;
}

//拆分自然数
//n为待拆分得自然数
int SplitNumber(int n, int* a)
{
int cnt = 0;

if(n < 2) return cnt;

a[0] = n;
for(int i = 1; i <= n/2; i++)
{
a[1] = i;
a[2] = n - a[1];
cnt = Sum(2, a);
}
return cnt;
}

//辅助函数
int Sum(int kx, int* a)
{
static int j = 0;
int k, m, p;

j++;
printf("%-4d: %d=", j, a[0]);
for(k = 1; k <= kx-1; k++)
printf("%d+", a[k]);
printf("%d\n", a[kx]);
k = kx;
p = a[k];
for(m = a[k-1]; m <= p/2; m++)
{
a[k] = m;
a[k+1] = p-m;
Sum(k+1, a);
}
return j;
}