社区
C语言
帖子详情
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
打赏
收藏
SOS求救~~~~~~~
呼叫各位大侠,求解一道编成题目(什么语言版本都成(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算一种情况 小弟在此谢过!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
可以考虑递归
SOS
求救
信号器应用开发.pptx
嵌入式系统应用(龙芯版)
酒店客房
SOS
紧急
求救
系统设计方案2.doc
酒店客房
SOS
紧急
求救
系统设计方案2.doc
酒店客房
SOS
紧急
求救
系统设计方案及对策.doc
酒店客房
SOS
紧急
求救
系统设计方案及对策.doc
基于Android的“
SOS
”
求救
短信发送功能实现.pdf
基于Android的“
SOS
”
求救
短信发送功能实现.pdf
万润客控
SOS
700客户端报警程序
此程序为万润客控的客户端插件,安装在酒店大堂前台万润客控电脑上,当客人在房间内出现紧急情况,按下房间内的
SOS
求救
按钮时,前台会接收到报警信号。
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章