鱼C论坛

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

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

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

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

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

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

代码一
#include <stdio.h>
#define MAX 100
void main()
{
        int n,num[MAX]={0},i,j,l,digit=1;
        printf("请输入要计算的阶乘:");
        scanf("%d",&n);
        num[0] = 1;
        {
                for (i = 1;i<=n;i++)//计算到第n阶
                {
                        for (j=0;j<digit;j++)//每一位都乘i
                        {
                                num[j]=num[j]*i;
                        }
                        for (j=0;j<digit;j++)
                        {
                                if (num[j]/10 > 0)//某一位需要进位
                                {
                                        num[j+1]+=num[j]/10;
                                        num[j] = num[j]%10;
                                                                                if (j == digit-1)//如果这一位是最大的那位
                                        {
                                                digit += 1;
                                        }
                                }
                        }
                }                      
                                printf("%d! = ",n);
                for (i=digit-1;i>=0;i--)
                {
                                        printf("%d",num[i]);
                }
                putchar('\n');
        }
}
代码2:
#include <stdio.h>
#define MAX 100
void main()
{
        int n,num[MAX]={0},i,j,l,digit=1;
        printf("请输入要计算的阶乘:");
        scanf("%d",&n);
        num[0] = 1;
        for(l=1;l<=n;l++)  //计算n次
        {
                for (i = 1;i<=l;i++)//计算到第l阶
                {
                        for (j=0;j<digit;j++)//每一位都乘i
                        {
                                num[j]=num[j]*i;
                        }
                        for (j=0;j<digit;j++)
                        {
                                if (num[j]/10 > 0)//某一位需要进位
                                {
                                        num[j+1]+=num[j]/10;
                                        num[j] = num[j]%10;
                                                                                if (j == digit-1)//如果这一位是最大的那位
                                        {
                                                digit += 1;
                                        }
                                }
                        }
                }                      
                                printf("%d! = ",l);
                for (i=digit-1;i>=0;i--)
                {
                                        printf("%d",num[i]);
                }
                putchar('\n');
        }
}
最佳答案
2019-5-17 19:13:52
YiMingC 发表于 2019-5-17 19:04
哈哈 我写的确实复杂,这是我们学校老师留的作业,要求用数组来处理阶乘解决数太大的问题。我们老师看了 ...

那也同理。多几个变量而已
#include <stdio.h>
#define MAX 100
void main()
{
        int n,num[MAX]={0},i,j,l,digit=1, m, k;
        printf("请输入要计算的阶乘:");
        scanf("%d",&m);


                for(k=1; k<=m; k++)
                {
                        // 初始化
                        n = k;
                        for(i=0; i<MAX; i++)
                        {
                                num[i]=0;
                        }
                        num[0] = 1;

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

                    for (j=0;j<digit;j++)
                    {
                            if (num[j]/10 > 0)//某一位需要进位
                            {
                                    num[j+1]+=num[j]/10;
                                    num[j] = num[j]%10;
                                    if (j == digit-1)//如果这一位是最大的那位
                                    {
                                            digit += 1;
                                    }
                            }
                    }
            }                      
            
                        printf("%d! = ",n);
            for (i=digit-1;i>=0;i--)
            {
                                printf("%d",num[i]);
            }
            putchar('\n');

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

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

使用道具 举报

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

亦即n!=1×2×3×...×n
求阶乘,这样不就可以了?
#include <stdio.h>

void main()
{
        int i, n, fac;

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


                fac = 1;
                for(i=1; i<=n; i++)
                {
                        fac *= i; 
                }

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

                return 0;

}


你问题2中想要得到的,这样不就好了。
#include <stdio.h>

void main()
{
    int i, j, n, m, fac;

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

        for (j=1; j<=n; j++)
        {
                fac = 1;
                m = j; // 第几阶
                for(i=1; i<=m; i++)
                {
                        fac *= i; 
                }

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


        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> 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
哈哈 我写的确实复杂,这是我们学校老师留的作业,要求用数组来处理阶乘解决数太大的问题。我们老师看了 ...

那也同理。多几个变量而已
#include <stdio.h>
#define MAX 100
void main()
{
        int n,num[MAX]={0},i,j,l,digit=1, m, k;
        printf("请输入要计算的阶乘:");
        scanf("%d",&m);


                for(k=1; k<=m; k++)
                {
                        // 初始化
                        n = k;
                        for(i=0; i<MAX; i++)
                        {
                                num[i]=0;
                        }
                        num[0] = 1;

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

                    for (j=0;j<digit;j++)
                    {
                            if (num[j]/10 > 0)//某一位需要进位
                            {
                                    num[j+1]+=num[j]/10;
                                    num[j] = num[j]%10;
                                    if (j == digit-1)//如果这一位是最大的那位
                                    {
                                            digit += 1;
                                    }
                            }
                    }
            }                      
            
                        printf("%d! = ",n);
            for (i=digit-1;i>=0;i--)
            {
                                printf("%d",num[i]);
            }
            putchar('\n');

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

}
想知道小甲鱼最近在做啥?请访问 -> 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-10-3 19:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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