2.3 计时函数

2-4 阶乘之和

  输入n,计算S = 1! + 2! +3! +……+ n!的末6位(不含前导0)。n <= 10^6,n!表示前n个正整数之积。

  样例输入:

  10

  样例输出:

  37913

 程序 2-7 阶乘之和(1)

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int sum = 0;
    int i = 1;
    while (i <= n)
    {
        //factorial 保存 i 的阶乘值
        int factorial = 1;
        int j = 1;
        for (j; j <= i; j++)
            factorial *= j;
        sum += factorial;
        i++;
    }

    printf("%d\n", sum % 1000000);


    return 0;
}

  输入10,完美输出。

  继续输入100,输出负的。很明显乘法又溢出了。通过 "输出中间变量" 的方法,输出中间sum值。

  可以发现 加上 13! 后sum就溢出了。那怎么办?把 int 改为前面的 long long可不可以呢?佷明显由于阶乘的指数增大,修改后起到的作用是杯水车薪。

  那怎么办?  重新审题发现,输出的是数的末6位。那只要把每次求出的factorial 和 sum都进行一次取余操作。溢出问题就迎刀而解了,毕竟加法与乘法运算,并不会改变结果。对程序做修改并增加计时函数:

  程序 2-8 阶乘之和(2)

#include<stdio.h>
#include<time.h>
int main()
{
    int n;
    scanf("%d", &n);
    int sum = 0;
    int i = 1;
    while (i <= n)
    {
        int factorial = 1;
        int j = 1;
        for (j; j <= i; j++)
            //对 factorial 取末六位
            factorial = factorial * j % 1000000;
        sum += factorial;
        //对 sum 取末六位
        sum = sum % 1000000;
        i++;
    }
    printf("%d\n", sum);

    //添加计时器,clock()每过千分之一秒(1毫秒),函数返回的值就加1,CLOCKS_PER_SE在 time.h 中定义为 1000.两数值相除得到的单位为秒
    printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);

    return 0;
}

  注意:键盘输入的时间也被计算在内。

 

转载于:https://www.cnblogs.com/Traim304/p/4619467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值