鱼C论坛

 找回密码
 立即注册
查看: 4711|回复: 5

C语言 递归函数 实现.

[复制链接]
发表于 2013-3-14 20:32:23 | 显示全部楼层 |阅读模式
30鱼币
题目 : 输入一正整数,输出等于这个数的所有可能的由小到大的若干正整数相加的式子.
例如: 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=2+1+4
   7=2+1+1+3
   7=2+1+1+1+2
   7=2+2+2+1
   7=2+2+3
   7=3+4

递归函数实现.

没有清晰的思路去解决.求教.

最佳答案

查看完整内容

这道题的逻辑是蛮麻烦的,关键是要把信息递归打出来,琢磨了两天,终于搞定了 代码: 运行结果:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 20:32:24 | 显示全部楼层
这道题的逻辑是蛮麻烦的,关键是要把信息递归打出来,琢磨了两天,终于搞定了
代码:
  1. #include<stdio.h>
  2. #include <conio.h>
  3. #include<stdlib.h>
  4. #include <iostream>
  5. #include<string>

  6. using namespace std;

  7. void analyze(int nNumber,int nCount,const char*szChar)
  8. {
  9.         if (nNumber==1)
  10.         {
  11.                 char szOut[256];
  12.                 sprintf_s(szOut,"%s+%d",szChar,1);
  13.                 cout<<szOut<<endl;
  14.         }
  15.         else
  16.         {
  17.                 int nRepeat = nNumber < nCount ? nNumber:nCount;
  18.                
  19.                 for (int i=1;i<=nRepeat;i++)
  20.                 {
  21.                         char szInfo[256];
  22.                         sprintf(szInfo,"%s+%d",szChar,i);
  23.                         if(nNumber-i)
  24.                                 analyze(nNumber-i,i,szInfo);
  25.                         else
  26.                         {
  27.                                 char szOut[256];
  28.                                 sprintf_s(szOut,"%s+%d",szChar,i);
  29.                                 cout<<szOut<<endl;
  30.                         }

  31.                 }
  32.         }
  33.        
  34. }

  35. void main(int argc, char **argv)
  36. {
  37.         while (true)
  38.         {
  39.                 int nNumber;
  40.                 cout << "请输入一个大于1的正整数:";
  41.                 cin >> nNumber;

  42.                 if (nNumber<=1)
  43.                 {
  44.                         cout << "输入有问题,请重新输入。"<<endl;
  45.                 }else
  46.                 {
  47.                         for (int i=1;i<nNumber;i++)
  48.                         {
  49.                                 char szInfo[256];
  50.                                 sprintf(szInfo,"%d=%d",nNumber,i);
  51.                                 analyze(nNumber-i,i,szInfo);

  52.                         }
  53.                        
  54.                 }
  55.                

  56.                 cout << "是否要继续程序(Y/N):";
  57.                 _flushall();
  58.                 int nTemp = _getch();
  59.                 if (nTemp==27 || nTemp==110 || nTemp==78)
  60.                 {
  61.                         return;
  62.                 }
  63.                 cout<<endl;
  64.                
  65.         }
  66.        
  67. }
复制代码
运行结果:
2.jpg 1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-14 21:47:12 | 显示全部楼层
暂时想不到,先放这里,等下有时间帮你敲一下代码!有了结果再告诉你啊....
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-14 22:11:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-15 07:07:25 | 显示全部楼层
等待中.请教思路.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-15 08:13:44 | 显示全部楼层
既然是由小到大那么
7=2+1+4
   7=2+1+1+3
   7=2+1+1+1+2
   7=2+2+2+1
应该把1放前边吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-5 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表