C语言题目,for循环潜逃情况下,为何参数m的位置不同,求出的结果不同?


大一小白遇到的C语言题目,为什么对于m的位置不同,求出的结果不同,感觉m的位置对运算没有影响

题目是求1到20的阶乘之和,但是对于M=1在循环中的位置不同,编译器给出的结果也不同。


 double i,j,n=0,m;
    for(i=1;i<=20;i++){
        m=1;
        for(j=1;j<=i;j++){
            m*=j;
            n=m+n;}}
    printf("%.0f",n);

图片描述

这个结果是正确的,但是把M=1,移到循环外面的时候结果就错误了。。。求解
图片描述

c for循环

刹那F清英 10 years ago

你别这么写啊,你每次计算阶乘的时候还有要从头开始,
至少利用一下之前所求的值啊。而且我用matlab验证一
下,你这个值求的是错的。


 c


 // 无聊写的,你看看吧
#include <stdio.h>

int main()
{
    double sum = 0, factorial = 1;
    int i = 0;

    for( i = 1; i <= 20; i++)
    {
        factorial *= i;
        printf("%lf\n", factorial);
        sum += factorial;
    }

    printf("sum: %lf\n", sum);

    return 0;
}

西红柿妖梦 answered 10 years ago


 double i,j,n=0,m;
    for(i=1;i<=20;i++){
        m=1;  
        printf("m的值%.0f", m);             
        for(j=1;j<=i;j++){
            m*=j;
            n=m+n;
        }
    }
    printf("%.0f",n);


 double i,j,n=0,m=1;
    for(i=1;i<=20;i++){
        printf("m的值%.0f", m);             
        for(j=1;j<=i;j++){
            m*=j;
            n=m+n;
        }
    }
    printf("%.0f",n);

楼主分别运行一下这俩代码

你会发现第一段代码中输出m的值都是1, 而第二段代码输出的都不一样。
因为第一段代码第二个for循环结束回到第一个for循环里的时候又把m重新赋值为1了。而第二段代码没有对m进行重新赋值,所以m的值时候一直是变化的。

嘿咻不破处 answered 10 years ago

那个。。内层循环结束后m要归1然后进行下一个阶乘的计算啊。。

多多良小傘 answered 10 years ago

我是这么理解的,M是每次计算阶乘的起点,如计算2的阶乘起点是1,计算10的阶乘的起点是1,既然是大一的学生或许我建议一下,取变量名的时候稍微花点心思了,又或许你的教材辅导书就是这么写的。。。

我发现底下有答案提出了不同的解题思路了
我的想法是减少乘的次数,这其中的规律不难发现


 2! = 2 * 1!;
3! = 3 * 2!;
...
n! = n * (n-1)!;

所以我们每次可以保留上一次阶乘的结果
以下是伪代码


 lastFact = 1 # 1的阶乘就是1
sum = 1      # 一开始就可以将sum置为1
for i in 2..20
    lastFact *= i
    sum += lastFact

斑斑驳驳s answered 10 years ago

m定义放在循环体外面,意味着在第一层循环的时候,m初始化的值是动态变化的的,具体多少看下面的 m*=j。
而放在循环体内,则 m 在第一层循环初始化的值一直为1.

2235760 answered 10 years ago

Your Answer