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;
}

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

 

posted @ 2015-07-03 19:46  Traim304  阅读(181)  评论(0编辑  收藏  举报