1.完全平方数的判断
int m=floor(sqrt(n)+0.5);
if (m*m==n)
...
注:四舍五入–floor(x+0.5)
2.例题2-4 阶乘之和
题:输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n<=10^6,n!表示前n个正整数之积。
解1:
#include <stdio.h>
#include <time.h>
int main()
{
int n;
scanf("%d",&n);
clock_t start,end;
start=clock(); //获取运行开始时的时间
int s=0;
for (int i=1;i<=n;i++)
{
int factorial=1;
for (int j=1;j<=i;j++)
factorial=factorial*j;
s=s+factorial;
}
printf("%d\n",s%100000);
end=clock(); //获取运行结束时的时间
printf("Time used=%.2f\n",(double)(end-start)/CLOCKS_PER_SEC); //输出程序运行时间
return 0;
}
此解法存在的两个问题:
问题1:n=100时,输出-961703,原因是乘法溢出
解决方案:计算只包含加法、减法和乘法的表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变
改良后程序:
#include <stdio.h>
#include <time.h>
int main()
{
const int MOD=100000; //使用常量定义,增强可读性,便于修改
int n;
scanf("%d",&n);
clock_t start,end;
start=clock(); //获取运行开始时的时间
int s=0;
for (int i=1;i<=n;i++)
{
int factorial=1;