SOS求救~~~~~~~

xiaogang198412 2005-04-23 03:17:20
呼叫各位大侠,求解一道编成题目(什么语言版本都成(b,p,c))
题目:拆分给出的自然数,把所有情况都打印出来,不能重复。
例如输入:4
输出:4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
4=4
ps.4=1+1+2 与4=1+2+1算一种情况
小弟在此谢过!!!!
...全文
190 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
augljyy 2005-04-26
  • 打赏
  • 举报
回复
#include "stdio.h"
void num(int number,int i)
{
int k,n=number;
while(n>i)
{
n=n-i;
if((n+i)!=number)
{
for(k=0;number-k>n;k=k+i)
printf("%d+",i);
printf("%d\n",n);
}
else
printf("%d+%d\n",i,n);
}
}
void main()
{
int j,m;
printf("input:");
scanf("%d",&m);
for(j=1;j<=m/2;j++)
num(m,j);
} 看这个行不?
zhangfjj 2005-04-26
  • 打赏
  • 举报
回复
查了些资料
/*此题其实就是求方程
n=x1+x2+...+xk的不重复正整数解(1<=k<=n)
如:
4=4
4=1+3=2+2=3+1
4=1+1+2=1+2+1=2+1+1
4=1+1+1+1
上面有重复的,仔细观察,由于对称性,所以
把其中非递减或非递增的取出就行了
对要分解的数i,可分解出来的数j共有i种可能选择,它们分别是:i,i-1,...,2,1。
但是为了保证分解出来的和数依次构成不增的正整数数列,则要求从i分解出来的和数j不
能超过a[k-1]。为了保证上述要求对第一步(k=1)分解也成立,程序可以在a[0]中预置n,
即第一个和数最大为n。

2)在分解过程中,当分解出来的数j=i时,说明已完成一个完整的和式分解,应该将和
式输出;当分解出来的数j和数。

这里取的是非递增解*/

#include <iostream>
using namespace std;
void f(int,int,int *);
int main()
{
system("cls");
int num;
int *sum;
cout<<"请输入一个整数:";
cin>>num;
sum=new int[num];//分解的最多个数是num个1,所以申请num长度的整型数组
sum[0]=num;
f(num,1,sum);
system("pause");
delete []sum;
return 0;
}
void f(int num,int n,int sum[])
{
for(int j=num;j>=1;j--)
{
if(j<=sum[n-1])
{
sum[n]=j;
if(j==num)//分解结束
{
cout<<sum[0]<<"="<<sum[1];
for(int i=2;i<=n;i++)
cout<<"+"<<sum[i];
cout<<endl;
}
else
f(num-j,n+1,sum);
}
}
}
zhangfjj 2005-04-23
  • 打赏
  • 举报
回复
楼上用递归的方法,我也想到了,但没有包含
4=2+2的这种情况。


如果前头这个数字较大时
如10=...那就少了很多哟
zhangfjj 2005-04-23
  • 打赏
  • 举报
回复
想了半天,原来是要用计算数学中差分方法来求,请看这个东西
http://zyk1.zyjjw.com.cn/RESOURCE/CZ/CZSX/SXBL/SXTS1037/2900_SR.HTM
最下面的东东!
blackmouth 2005-04-23
  • 打赏
  • 举报
回复
对于任意大于1的整数n都可以拆分为1和n-1 所以用递归如下:
void devide(int n,vector<int> record)
{
if(n==1)
return;
record.pop_back();
record.push_back(1);
record.push_back(n-1);
把record里面的元素全部打印成一行;
devide(n-1,record);
}
例如如果输入为4,即调用devide(4,record)
则输出:
1 3
1 1 2
1 1 1 1

注明:
调用devide(4,record)之前要对record初始化,让他含有一个任意的整数;
至于如何把record里面的元素全部打印成一行如果还不清楚可以查看C++里面vector的操作
zhangfjj 2005-04-23
  • 打赏
  • 举报
回复
上面还不行,改进了一下!大家看看行不行了?
不过,好象无法去掉重复的和式哟!

比如5,把它分成一棵二叉树,这样的

5
/ \
1 4
/ \
1 3
/ \
1 2
/ \
1 1



这样,就可以给出分解,
0层 5=5
1层 5=1+4
2层
取前1个叶结点之和与后面各项相加 5=1+1+3
取前2个叶结点之和与后面各项相加 5=2+3
3层
取前1个叶结点之和与后面各项相加 5=1+1+1+2
取前2个叶结点之和与后面各项相加 5=2+1+2
取前3个叶结点之和与后面各项相加 5=3+2
4层
取前1个叶结点之和与后面各项相加 5=1+1+1+1+1
取前2个叶结点之和与后面各项相加 5=2+1+1+1
取前3个叶结点之和与后面各项相加 5=3+1+1
取前4个叶结点之和与后面各项相加 5=4+1
即对于任意一个自然数,可分解的种数为它的树的层数
每种分解法,为其该层所有结点再加上上一层的叶结点之和。

对于你的4来说
4
/ \
1 3
/ \
1 2
/ \
1 1

0层 4=4
1层 4=1+3
2层
取前1个叶结点之和与后面各项相加 4=1+1+2
取前2个叶结点之和与后面各项相加 4=2+2
3层
取前1个叶结点之和与后面各项相加 4=1+1+1+1
取前2个叶结点之和与后面各项相加 4=2+1+1
取前3个叶结点之和与后面各项相加 4=3+1

注:取叶结点数由层数控制。
zhangfjj 2005-04-23
  • 打赏
  • 举报
回复
对于你的4来说
4
/ \
1 3
/ \
1 2
/ \
1 1
即4=1+3
4=1+1+2
4=1+1+1+1
zhangfjj 2005-04-23
  • 打赏
  • 举报
回复
算法想清楚了
比如5,把它分成一棵二叉树,这样的

5
/ \
1 4
/ \
1 3
/ \
1 2
/ \
1 1



这样,就可以给出分解,且不重复了
5=1+4
5=1+1+3
5=1+1+1+2
5=1+1+1+1+1
即对于任意一个自然数,可分解的种数为它的树的层数
每种分解法,为其该层所有结点再加上上一层的叶结点之和。
xiaogang198412 2005-04-23
  • 打赏
  • 举报
回复
我想了半天想不出算法来,各位能否提供一个好的算法?
小弟在此谢过了
dongyuanzhang 2005-04-23
  • 打赏
  • 举报
回复
网上这个题目的答案太多了,自己搜一搜啊!

这个题对锻炼自己的能力思想很有好处 。
277894613 2005-04-23
  • 打赏
  • 举报
回复
可以考虑递归

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧