标签:
例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; }
注意:键盘输入的时间也被计算在内。
标签:
原文地址:http://www.cnblogs.com/Traim304/p/4619467.html