c程序求1!+2!+3!+4!+...+20!。

感觉代码没错,可以结果不正确,结果是-2102132736,感觉不是这么小#include<stdio.h>intmain(void){ints,i,sum=0;s=1;... 感觉代码没错,可以结果不正确,结果是-2102132736,感觉不是这么小
#include<stdio.h>
int main(void)
{
int s,i,sum=0;
s=1;
for(i=1;i<=20;i++)
s*=i;
sum+=s;
printf("%ld\n",sum);
}
展开
 我来答
cpucash
推荐于2017-11-26 · TA获得超过1585个赞
知道小有建树答主
回答量:1457
采纳率:66%
帮助的人:1049万
展开全部
#include<stdio.h>
int main(void)
{
int s,i,sum=0;
s=1;
for(i=1;i<=20;i++)
{s*=i;
sum+=s;} //for需要包含这两句
printf("%ld\n",sum);
}
这个程序是大数问题。20的阶乘是一个很大的数
程序我给你改后事没有问题,但是这个是因为溢出了,所以成为负数,要是long long int 还装不下,那么你就要考虑用字符串来解决了
前端小茶馆
2014-03-04 · TA获得超过962个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:371万
展开全部

用int绝对是不行的,20!的结果是会超出int的上限的

而且long类型和int类型,在不同的编译器中表示的范围是不一样的。有的编译器里long与int表示的是同一个范围,都是用32为存储的。


建议用long long 或者unsigned long long 来进行存储,输出时用"%I64d"。不过我还试了一下double类型,貌似也不行呀。假如是特别大的数据,可以用字符串进行模拟,当然本题目是不用的。

#include <stdio.h>
#include<math.h>
int main()
{
    long long i, sum, s;
    // double i, sum, s;
    s = 1;
    sum = 0;
    for(i=1; i<=20; i++)
    {
        s *= i;
        sum += s;
    }
    printf("%I64d\n", sum);

    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
無極
2016-07-13 · TA获得超过375个赞
知道小有建树答主
回答量:584
采纳率:25%
帮助的人:273万
展开全部
首先你用的int,存不下那么大的数,要用double.另外你的for循环没用{ },要把两句扩起来,不然for循环的范围只到第一个分号就结束了,后面的sum+=s没有被循环到
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6205bc1
2014-03-04 · TA获得超过6004个赞
知道大有可为答主
回答量:5933
采纳率:20%
帮助的人:3005万
展开全部

你计算过程都搞错了,

for(i=1;i<=20;i++)
s*=i;
sum+=s;

怎么可能是算

1!+2!+3!+4!+...+20!

这样只能算出20!


#include <stdio.h>
double factorial(int num)
{
int i;
double dResult = 1.0;

for(i = 1; i <= num; ++i)
{
dResult *= i;
}
return dResult;
}
int main()
{
double dSum = 0.0;
int i;
for(i = 1; i <= 20; ++i)
{
dSum += factorial(i);
}
printf("The 20's factorial is %lf\n", dSum);
return 0;
}
更多追问追答
追问
没有吧,算的就是1!+2!++++20!
追答
你还不理解么?你这里的算法一个循环能算出1!+2!+3!+4!+...+20! ????
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nigoole
2014-03-04 · TA获得超过1369个赞
知道小有建树答主
回答量:675
采纳率:71%
帮助的人:504万
展开全部
#include <stdio.h>
int main(void) 
{
    int i, j;
    long sum=0;
    long s=1; 
    for(i=1;i<=10;i++) // 你如果不知道什么时候溢出就先定义10,然后再加
    {
       // 这样才是算的阶乘
       for (j = 1; j <= i; j++)
       {
           s*=j;
       }
       // 再累加和
       sum += s;
    } 
    printf("%ld\n",sum);
    return 0; // main函数为int型记得添加返回值
}
追问
运算过答案好小
追答
// 不好意思之前未验证,现在是完整的代码
#include <stdio.h>
int main(void)  

    int i, j; 
    long sum = 0; 
    long s = 1;  
    for(i = 1; i <= 10; i++) // 你如果不知道什么时候溢出就先定义10,然后再加 
    { 
      // 每次计算还原s的值
      s = 1;
       // 这样才是算的阶乘 
       for (j = 1; j <= i; j++) 
       { 
           s*=j; 
       }
        // 这里可以看到具体情况
        printf("%d! = %ld\n", i, s);
       // 再累加和 
       sum += s; 
    }  
    printf("the sum = %ld\n",sum); 
    return 0; // main函数为int型记得添加返回值 
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(12)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式