编程题一道

zwt7790195 2007-09-01 11:08:20
输出和为一个给定整数的所有组合
例如n=5
5=1+4;5=2+3(相加的数不能重复)
则输出
1,4;2,3
...全文
1116 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
食人族哲学家 2007-09-05
  • 打赏
  • 举报
回复
坚决反对递归.本人的递归就相当差,但不是因为差而不用,而是基本不用而能力变的很糟糕.递归就是无数次的函数调用(伴随着大量的进出栈和内存消耗),效率极其低下.如果要搞程序,个人认为递归只用于2种情况,1.新手学习有关;2.实在没办法了(技术和时间上)
dustcool 2007-09-03
  • 打赏
  • 举报
回复
tree
sky03111 2007-09-02
  • 打赏
  • 举报
回复
//此题目是要找出用户给定的数字范围内的回文数!
#include <stdio.h>
void sky(){
int I = 0; //声明变量并赋初值。
printf("请输入您要进行解读的整形数字:");
scanf("%d",&I); //得到用户输入的数据。
int r[I]; //声明整形数据的数组,并以数字的大小决定数组的大小。

for(int i = 0;i<I;i++){ //变量 I 为数组 r 的长度!
if(r[i]!=r[I-i-1]){ //判断是否被显示!
printf("%d + %d;",&r[i],&r[I-i-1]);//显示所有的组合!
}
}

static void main(){
sky();//此操作只执行一遍!
}
sky03111 2007-09-02
  • 打赏
  • 举报
回复
此解决方案未编译过哦。请大家多多指教!呵呵
sky03111 2007-09-02
  • 打赏
  • 举报
回复
//此题目是要找出用户给定的数字范围内的回文数!
#include <stdio.h>
void sky(){
int I = 0; //声明变量并赋初值。
printf("请输入您要进行解读的整形数字:");
scanf("%d",&I); //得到用户输入的数据。
int r[I]; //声明整形数据的数组,并以数字的大小决定数组的大小。

for(int i = 0;i<I;i++){ //变量 I 为数组 r 的长度!
if(r[i]!=r[I-i]){ //判断是否被显示!
printf("%d + %d;",&r[i],&r[I-i-1]);//显示所有的组合!
}
}

static void main(){
sky();//此操作只执行一遍!
}
sanyuesanshi 2007-09-02
  • 打赏
  • 举报
回复
程序如下,测试通过
#include<iostream>
#include<vector>
using namespace std;
vector<int> a;
int main(){
void f(int,int);
std::cout<<"please input a number:";
int num;
std::cin>>num;
f(1,num);
}
void f(int min,int obj){
for(int i=min;i<obj-i;++i){
a.push_back(i);
for(int j=0;j<a.size();j++){std::cout<<a[j]<<'+';}
std::cout<<obj-i<<endl;
f(i+1,obj-i);
a.pop_back();
}
}
mxliang 2007-09-02
  • 打赏
  • 举报
回复
楼上的

scanf("%d",&I); //得到用户输入的数据。
int r[I]; //声明整形数据的数组,并以数字的大小决定数组的大小

有问题啊(窃以为)

ld_key_new 2007-09-02
  • 打赏
  • 举报
回复
c#版递归实现,m为给定整数,测试通过。

private int[] temp=new int[m]; int curPos=0;

private void Find(int CurVal)
{

temp[curPos] = CurVal;

int Sum = 0;
for (int lint_LoopCount = 0; lint_LoopCount <= curPos; lint_LoopCount++)
{
Sum += this.temp[lint_LoopCount];
}

if (Sum == m&&curPos!=0)
{
string lstg_Temp = "";
for (int lint_LoopCount = 0; lint_LoopCount <= curPos; lint_LoopCount++)
{
lstg_Temp += temp[lint_LoopCount] + ",";
}


MessageBox.Show(lstg_Temp);

curPos--;
return;

}
else if (Sum > m) { curPos--; return; }
else
{
for (int i = CurVal + 1; i < m; i++)
{
curPos++;
Find(i);

}
curPos--;
}
}


调用函数:
for (int i = 1; i < m i++)
{
this.curPos = 0;
this.Find(i);
}

expter 2007-09-01
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
int sum=0;
int Num(int n,int a)
{
sum+=n;
if(n==0)
{
cout<<endl;
return 0;
}
else
{
if(sum>a)
{
sum-=n;
n-=1;
return Num(n,a);

}
else
{
cout<<"+"<<n;
return Num(n,a);
}
}
}
int main()
{
int a=0,n=0,summ=0;
cin>>a; //输入的数
for(int i=a;i>0;i--)
{
n=a-i; //取出减去i后的得数
if(n>=i) //当n>=i(即3=3时)n最高只能是i,以免出现6=2+4的重复现象
{
n=i;
}
cout<<a<<"="<<i;
if(n==0)
{
cout<<endl;
}
sum=i;
while(n>0) //n==0进行下一次取n操作
{
summ+=1;
Num(n,a); //对n进行分解
if(n!=1)
{
cout<<a<<"="<<i;
}
sum=i; //为进行下一步处理,使sum清0
if(sum+n+1<a && i!=1 && n!=1)//为适应出现6=2+2+1+1情况使6=2+2+2中的第3个2划分
{
cout<<"+"<<n;
sum+=n;
n-=1;
Num(n,a);
sum=i;
cout<<a<<"="<<i;
summ+=1;
}
else
{
n-=1;
}
}
}
summ+=1;
cout<<"num = "<<summ<<endl;
return 0;
}

看看对不哦
zwt7790195 2007-09-01
  • 打赏
  • 举报
回复
大家误会这道题的意思了 看好是 输出和为一个给定整数的所有组合
加入输入的是10 那么1+2+3+4 也是哦.
beansz 2007-09-01
  • 打赏
  • 举报
回复
6=1+5, 2+4, 1+2+3 ?
飞喵 2007-09-01
  • 打赏
  • 举报
回复
www.baidu.com

散分吧~
expter 2007-09-01
  • 打赏
  • 举报
回复
赫赫 散分吧
cofchen 2007-09-01
  • 打赏
  • 举报
回复
同意楼上的观点。哈
linfengc 2007-09-01
  • 打赏
  • 举报
回复
100分哦,有倒分嫌疑。。
lz还是把分3了吧
linfengc 2007-09-01
  • 打赏
  • 举报
回复
这个题太弱智了。。。
ckt 2007-09-01
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{

int iNum = 0;
printf("Please Input the number:");
scanf("%d", &iNum);
int iTemp = iNum/2 + 1;
for (int i = 0; i < iTemp; i++)
{
printf("%d,%d\n", i, iNum-i);
}
return 0;
}
iatsbg 2007-09-01
  • 打赏
  • 举报
回复
我用递归写的,不会输出重复的数。

#include <stdio.h>

int nums[10000];
int count=0;

void Print()
{
int i;
for (i=0; i<count-1; ++i) printf("%d,",nums[i]);
printf("%d;", nums[i]);
}

void Cal(int sum, int min, int first)
{
int i;
for (i=min; sum-i>i; ++i)
{
nums[count++]=i;
Cal(sum-i, i+1, 0);
--count;
}
if (first) return;
nums[count++]=sum;
Print();
--count;
}

int main()
{
int sum;
scanf("%d", &sum);
Cal(sum, 1, 1);
}
RocheFoo 2007-09-01
  • 打赏
  • 举报
回复
jf
食人族哲学家 2007-09-01
  • 打赏
  • 举报
回复
貌似很容易,先算最大的加数个数,sum=1+2+3+4等等,直到输入数inputn-sum<n,这样n就是最大的加数个数,再使每个加数按升序排列,穷举就ok了.(当然,小于n个加数的也要算)
加载更多回复(6)

69,336

社区成员

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

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