C语言OJ项目参考(1034) 求值

(1034) 求值
Description
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。
Input
n
Output

Sample Input
5
Sample Output
153
参考解答

#include <stdio.h>
int main ( )
{
    int n, i;
    long fact=1, sum=1;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
    {
        fact=fact*i;
        sum+=fact;
    }
    printf("%ld", sum);
    return 0;
}

  本题中未指定n的大小。实际上,当n≥13时,n!就已经超过int型数据的取值范围而溢出。所以,本题中,将fact、sum定义为long型,以解决溢出问题。
  目前在32位的系统中,long型与int都占4个字节。结果是,n≥13时,即使fact、sum定义为long型,溢出在所难免。我在编这道程序时,在我的机器上测试,int型的结果与long型的结果一致。
  神奇的是,在OJ平台上,fact、sum定义为int型为错,当它们为long型时却对了。因为,代码被提交到了服务器,服务器是64位的,long型为8个字节。
  另外,下面的程序是最保险的:

#include <stdio.h>
int main ( )
{
    int n, i;
    long long int fact=1, sum=1;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
    {
        fact=fact*i;
        sum+=fact;
    }
    printf("%lld", sum);
    return 0;
}

  这里,将fact、sum定义为long long int型,即使32位系统,当n≥13时,变可以得到正确的解答,这时,输出结果时,格式控制该用%lld。不过,在32位系统上安装的CodeBlocks会给我们出来2个warning,不要理会即是。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值