1:在算法竞赛中,每行输出均应回车符结束,包括最后一行。除非特别的说明,每行的行首不应该有空格,但行末通常可以有多余空格。另外输出的没二个数字或者字符串之间应以单个的空格隔开。
尽量的用const关键字声明常数。
2:阶层之和:
计算s = 1!+2!+3!+.....+n!的后六位。其中n<=106
一般的想法:
#include "stdio.h"
int main () {
int i,j,n,s=0;
scanf ("%d",&n);
for (i = 1;i <=n;i++) {
int factorial = 1;
for (j = 1;j <=i;j++) {
factorial *= j;
}
s+= factorial;
}
printf ("%d\n",s % 1000000);
return 0;
}
上面的解法会导致乘法溢出。要解决这个问题需要一些数学的知识:
要计算只包含加法,减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。
改进后的代码如下:
#include "time.h"
#include "stdio.h"
int main () {
int i,j,n,s=0;
const int MOD = 1000000;
scanf ("%d",&n);
for (i = 1;i <=n;i++) {
int factorial = 1;
for (j = 1;j <=i;j++) {
factorial = factorial * j % MOD;
}
s = (s + factorial) % MOD;
}
printf ("%d\n",s);
return 0;
}当n取1000000的时候程序估计要好几个小时才能结束:
发现:但n = 25的时候25!的结果末尾有6个0所以可以在程序中加上一句:if (n > 25) n = 25;