鱼C论坛

 找回密码
 立即注册
查看: 1269|回复: 4

[已解决]循环嵌套的问题

[复制链接]
发表于 2019-5-17 16:32:13 | 显示全部楼层 |阅读模式

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

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

x
是一个计算阶乘的问题,我单独计算某阶阶乘的时候结果都是正确的(见代码1),但只是再外面多套一个循环就全乱套了(代码2),输出结果如图。找了很久找不到问题,麻烦大家帮忙看看。

代码一

  1. #include <stdio.h>
  2. #define MAX 100
  3. void main()
  4. {
  5.         int n,num[MAX]={0},i,j,l,digit=1;
  6.         printf("请输入要计算的阶乘:");
  7.         scanf("%d",&n);
  8.         num[0] = 1;
  9.         {
  10.                 for (i = 1;i<=n;i++)//计算到第n阶
  11.                 {
  12.                         for (j=0;j<digit;j++)//每一位都乘i
  13.                         {
  14.                                 num[j]=num[j]*i;
  15.                         }
  16.                         for (j=0;j<digit;j++)
  17.                         {
  18.                                 if (num[j]/10 > 0)//某一位需要进位
  19.                                 {
  20.                                         num[j+1]+=num[j]/10;
  21.                                         num[j] = num[j]%10;
  22.                                                                                 if (j == digit-1)//如果这一位是最大的那位
  23.                                         {
  24.                                                 digit += 1;
  25.                                         }
  26.                                 }
  27.                         }
  28.                 }                     
  29.                                 printf("%d! = ",n);
  30.                 for (i=digit-1;i>=0;i--)
  31.                 {
  32.                                         printf("%d",num[i]);
  33.                 }
  34.                 putchar('\n');
  35.         }
  36. }
复制代码

代码2:
  1. #include <stdio.h>
  2. #define MAX 100
  3. void main()
  4. {
  5.         int n,num[MAX]={0},i,j,l,digit=1;
  6.         printf("请输入要计算的阶乘:");
  7.         scanf("%d",&n);
  8.         num[0] = 1;
  9.         for(l=1;l<=n;l++)  //计算n次
  10.         {
  11.                 for (i = 1;i<=l;i++)//计算到第l阶
  12.                 {
  13.                         for (j=0;j<digit;j++)//每一位都乘i
  14.                         {
  15.                                 num[j]=num[j]*i;
  16.                         }
  17.                         for (j=0;j<digit;j++)
  18.                         {
  19.                                 if (num[j]/10 > 0)//某一位需要进位
  20.                                 {
  21.                                         num[j+1]+=num[j]/10;
  22.                                         num[j] = num[j]%10;
  23.                                                                                 if (j == digit-1)//如果这一位是最大的那位
  24.                                         {
  25.                                                 digit += 1;
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }                     
  30.                                 printf("%d! = ",l);
  31.                 for (i=digit-1;i>=0;i--)
  32.                 {
  33.                                         printf("%d",num[i]);
  34.                 }
  35.                 putchar('\n');
  36.         }
  37. }
复制代码
最佳答案
2019-5-17 19:13:52
YiMingC 发表于 2019-5-17 19:04
哈哈 我写的确实复杂,这是我们学校老师留的作业,要求用数组来处理阶乘解决数太大的问题。我们老师看了 ...

那也同理。多几个变量而已

  1. #include <stdio.h>
  2. #define MAX 100
  3. void main()
  4. {
  5.         int n,num[MAX]={0},i,j,l,digit=1, m, k;
  6.         printf("请输入要计算的阶乘:");
  7.         scanf("%d",&m);


  8.                 for(k=1; k<=m; k++)
  9.                 {
  10.                         // 初始化
  11.                         n = k;
  12.                         for(i=0; i<MAX; i++)
  13.                         {
  14.                                 num[i]=0;
  15.                         }
  16.                         num[0] = 1;

  17.                         /* 每个数阶乘代码块 开始 */
  18.             for (i = 1;i<=n;i++)//计算到第n阶
  19.             {
  20.                     for (j=0;j<digit;j++)//每一位都乘i
  21.                     {
  22.                             num[j]=num[j]*i;
  23.                     }

  24.                     for (j=0;j<digit;j++)
  25.                     {
  26.                             if (num[j]/10 > 0)//某一位需要进位
  27.                             {
  28.                                     num[j+1]+=num[j]/10;
  29.                                     num[j] = num[j]%10;
  30.                                     if (j == digit-1)//如果这一位是最大的那位
  31.                                     {
  32.                                             digit += 1;
  33.                                     }
  34.                             }
  35.                     }
  36.             }                     
  37.             
  38.                         printf("%d! = ",n);
  39.             for (i=digit-1;i>=0;i--)
  40.             {
  41.                                 printf("%d",num[i]);
  42.             }
  43.             putchar('\n');

  44.                         /* 每个数阶乘代码块 结束 */
  45.                 }

  46. }
复制代码
微信图片_20190517163028.png
微信图片_20190517163139.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-17 19:00:36 | 显示全部楼层
一个简单的求阶乘,被你搞得这么复杂。看了你的代码,我觉得这个世界真的是没有什么不可能。

亦即n!=1×2×3×...×n
求阶乘,这样不就可以了?

  1. #include <stdio.h>

  2. void main()
  3. {
  4.         int i, n, fac;

  5.         printf("请输入要计算的阶乘:");
  6.         scanf("%d",&n);


  7.                 fac = 1;
  8.                 for(i=1; i<=n; i++)
  9.                 {
  10.                         fac *= i;
  11.                 }

  12.                 printf("%d!= %d\n", n, fac);

  13.                 return 0;

  14. }
复制代码



你问题2中想要得到的,这样不就好了。

  1. #include <stdio.h>

  2. void main()
  3. {
  4.     int i, j, n, m, fac;

  5.     printf("请输入要计算的阶乘:");
  6.     scanf("%d",&n);

  7.         for (j=1; j<=n; j++)
  8.         {
  9.                 fac = 1;
  10.                 m = j; // 第几阶
  11.                 for(i=1; i<=m; i++)
  12.                 {
  13.                         fac *= i;
  14.                 }

  15.                 printf("%d!= %d\n", m, fac);
  16.         }


  17.         return 0;

  18. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-17 19:04:28 From FishC Mobile | 显示全部楼层
ba21 发表于 2019-5-17 19:00
一个简单的求阶乘,被你搞得这么复杂。看了你的代码,我觉得这个世界真的是没有什么不可能。

亦即n!=1× ...

哈哈 我写的确实复杂,这是我们学校老师留的作业,要求用数组来处理阶乘解决数太大的问题。我们老师看了这代码十分多钟也没找到问题出在哪...只能回来咱们论坛求助了(_)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-17 19:13:52 | 显示全部楼层    本楼为最佳答案   
YiMingC 发表于 2019-5-17 19:04
哈哈 我写的确实复杂,这是我们学校老师留的作业,要求用数组来处理阶乘解决数太大的问题。我们老师看了 ...

那也同理。多几个变量而已

  1. #include <stdio.h>
  2. #define MAX 100
  3. void main()
  4. {
  5.         int n,num[MAX]={0},i,j,l,digit=1, m, k;
  6.         printf("请输入要计算的阶乘:");
  7.         scanf("%d",&m);


  8.                 for(k=1; k<=m; k++)
  9.                 {
  10.                         // 初始化
  11.                         n = k;
  12.                         for(i=0; i<MAX; i++)
  13.                         {
  14.                                 num[i]=0;
  15.                         }
  16.                         num[0] = 1;

  17.                         /* 每个数阶乘代码块 开始 */
  18.             for (i = 1;i<=n;i++)//计算到第n阶
  19.             {
  20.                     for (j=0;j<digit;j++)//每一位都乘i
  21.                     {
  22.                             num[j]=num[j]*i;
  23.                     }

  24.                     for (j=0;j<digit;j++)
  25.                     {
  26.                             if (num[j]/10 > 0)//某一位需要进位
  27.                             {
  28.                                     num[j+1]+=num[j]/10;
  29.                                     num[j] = num[j]%10;
  30.                                     if (j == digit-1)//如果这一位是最大的那位
  31.                                     {
  32.                                             digit += 1;
  33.                                     }
  34.                             }
  35.                     }
  36.             }                     
  37.             
  38.                         printf("%d! = ",n);
  39.             for (i=digit-1;i>=0;i--)
  40.             {
  41.                                 printf("%d",num[i]);
  42.             }
  43.             putchar('\n');

  44.                         /* 每个数阶乘代码块 结束 */
  45.                 }

  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-17 20:42:02 | 显示全部楼层
ba21 发表于 2019-5-17 19:13
那也同理。多几个变量而已

啊对,算完一次以后忘了初始化数组了,明白了明白了,谢谢啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 08:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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