smarth 发表于 2020-11-15 14:37

[洛谷][vs 2019] [c语言] 相同输入,输出不同

本帖最后由 smarth 于 2020-11-15 16:35 编辑

在洛谷上刷题目,求阶乘之和。
代码:
#include<stdio.h>
int factial(int n) {
    if (n == 0 || n == 1)
      return 1;
    else
      return n * factial(n - 1);
}
int main(void)
{
    int n;
    unsigned long long s = 0;
    scanf_s("%d", &n);
    for (int i = 1; i <= n; i++) {
      s += factial(i);
    }
    printf("%llu\n", s);

    return 0;
}
在vs中输入22,输出2845178393
而洛谷显示输入22,输出1177652997443428940313
好多次了,我在本地ide答案好好的,洛谷是另一种输出。
求解答!!!


/**
**谢谢各位啦,原因是数值溢出。这道题数目太大,不能单纯计算,我去找其他思路了
**/

浅暮丶千殇 发表于 2020-11-15 15:28

部分数值在不同的系统环境下 输出的结果也不同

裴Beta 发表于 2020-11-15 15:38

上面的函数返回值是int类型,n比较大的时候会溢出

EzGDNull 发表于 2020-11-15 16:06

#include<stdio.h>
unsigned long long factial(int n) {
//你改一下这个返回值类型为unsigned long long,输入22时,得到的结果是15508120799727188505,很明显连unsigned long long这个数据类型也溢出了
    if (n == 0 || n == 1)
      return 1;
    else
      return n * factial(n - 1);
}
int main(void)
{
    int n;
    unsigned long long s = 0;
    scanf_s("%d", &n);
    for (int i = 1; i <= n; i++) {
      s += factial(i);
    }
    printf("%llu\n", s);

    return 0;
}

smarth 发表于 2020-11-15 16:33

EzGDNull 发表于 2020-11-15 16:06
#include
unsigned long long factial(int n) {
//你改一下这个返回值类型为unsigne ...

谢谢。
这道题似乎不能用这个思路做。
我调试后发现22!本身在unsigned long long里,但阶乘之和就溢出了。需要找其他思路
再次感谢
页: [1]
查看完整版本: [洛谷][vs 2019] [c语言] 相同输入,输出不同