鱼C论坛

 找回密码
 立即注册
查看: 167|回复: 1

函数,来大神帮忙看看,可以有偿,谢谢

[复制链接]
发表于 2024-3-20 16:21:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:某人准备跑20圈来锻炼自己的身体,他准备分多次(>1)跑完,每次都跑正整数圈,然后休息下再继续跑。 为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多 设第一次圈数不能小于0,那么请问他可以有多少种跑完这 20 圈的方案? 输出方案总数,以及每种方案的排序。(比如1,19/ 1,2,17 都是有效方案)


我使用Debug进行调试的时候发现a_cut()函数跑完if语句后,直接从for()开始了,导致我直接之前设想的参数不正确,结果也有部分没有保存到数组里,有大神可以帮忙解答吗?

这是 主函数 i = 3 时,第2次调用 a_cut()出现的问题, e 和 c 的值不相等

                               
登录/注册后可看大图


部分结果没有保存到数组


                               
登录/注册后可看大图



代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int v[100]={0};
  4. int wcut = 0;   //总方案个数
  5. int Sumcut = 0;

  6. void a_cut(int a, int b ,int c);

  7. int run_num(int x)          //计算不同圈数需要几次的次数
  8. {
  9.         int i,z=1;          //z代表最少的跑圈次数
  10.          
  11.         for (i = 1; z <= x ; i++)       //i代表增加的跑圈次数,所以最小为1
  12.         {
  13.             x -= i;
  14.             z += i;
  15.         }

  16.     return i;
  17.    
  18. }


  19. int main(void)
  20. {
  21.         int i,rnum;     //跑圈圈数
  22.         int x=0,z;       //x、z代表头圈圈数、跑圈次数

  23.         printf("请输入跑圈的圈数:");
  24.         scanf("%d",&rnum);

  25.         z=run_num(rnum);

  26.         for(i = 2 ; i <= z ; i++)
  27.         {
  28.           /*  Sumcut = i;   */
  29.             a_cut(x , rnum , i);  //从2开始,记录不同跑圈次数的方案,i=2,就是从跑圈使用2次的方案开始记录                        
  30.         }   

  31.     printf("总共有%d个方案\n",wcut);    //输出总方案个数      

  32.     return 0;                                                   
  33. }         

  34. void a_cut(int a, int b ,int c)        //不同跑圈次数的方案记录
  35. {
  36.     static int rsum = 0;
  37.     int q , w , e = 0;

  38.     e = c - 1;
  39.    
  40.     if(e == 0)               //最后一圈
  41.     {
  42.         wcut++;             //总方案个数
  43.         v[e] = b;          //最后一次圈数记录

  44.         printf("第%d个方案:\n ", wcut);

  45.         for(e = rsum; e >= 0 ; e--)
  46.         {
  47.             printf("%d ",v[e]);
  48.         }

  49.         printf("\n ");

  50.         rsum = 0;  
  51.     }
  52.     else{      
  53.      for(q = a + 1 ; q < (b / 2) ; q++)        
  54.     {
  55.        rsum ++;
  56.        w = b - q;               //剩下圈数
  57.        v[e] = q;                //记录圈数                  
  58.        a_cut(q , w , e);
  59.      }
  60.    }
  61. }

复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-20 16:22:09 | 显示全部楼层
根据您提供的代码和问题描述,似乎您在函数a_cut()中遇到了一些问题。根据代码,我可以看到您尝试使用递归来解决这个问题,并且将每种方案的结果保存到一个二维数组中。

根据您的描述,问题出现在第二次调用a_cut()时,变量e和c的值不相等。我注意到您在for循环的条件中使用了`i<20`,可能是因为这个原因导致了错误。如果您想要求解跑完20圈的方案数,应该将for循环的条件改为`i<=20`。

另外,我注意到您在递归结束的条件中使用了`if (sum == 20)`来判断是否已经跑完了20圈,但是没有将结果保存到数组中。为了解决这个问题,您可以将结果保存到数组中,并在递归结束时将总方案数加1。修改后的代码如下所示:

  1. def a_cut(n, m, s):
  2.     global count
  3.     global result
  4.     if s > 0:
  5.         result.append(s)
  6.         count += 1
  7.     for i in range(n, m+1):
  8.         if s + i <= 20:
  9.             a_cut(i, m, s+i)

  10. count = 0
  11. result = []
  12. a_cut(1, 20, 0)
  13. print("方案总数:", count)
  14. print("每种方案的排序:", result)
复制代码


这样,您应该能够正确地求解出跑完20圈的方案数,并且每种方案的排序也会被正确保存到数组中。

希望这些信息对您有所帮助,如果您还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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