P24 3n+1问题
#include<stdio.h>
int main()
{
int i,n,count = 0;
scanf("%d",&n);
while(n>1)
{
if(n%2) n = 3*n+1;
else n = n/2;
count++;
}
printf("%d",count);
return 0;
}
当输入n较大时(如987654321,后续计算过程n超出int范围),出现错误结果
改进:定义long long 型变量a 承接n的值,并用于后续计算
#include<stdio.h>
int main()
{
int i,n,count = 0;
long long a;
scanf("%d",&n);
a = n;
while(a>1)
{
if(a%2) a = 3*a+1;
else a = a/2;
count++;
}
printf("%d",count);
return 0;
}
P25
输出1——n的阶乘和后六位
输出1——n的阶乘和后六位
#include<stdio.h>
int main()
{
const int MOD = 1000000;
int i,n,a,sum = 0,re;
scanf("%d",&n);
for(i = 1;i<=n;i++)
{
re = 1;
for(a = 1;a<=i;a++)
re *= a;
sum += re;
}
printf("%d\n",sum%1000000);
return 0;
}
由于较大数据会越界
要计算只包含加法、乘法、减法的整数表达式除以正整数n的余数,
可以在每步计算后对n取余,结果不变
要计算只包含加法、乘法、减法的整数表达式除以正整数n的余数,
可以在每步计算后对n取余,结果不变
#include<stdio.h>n
int main()
{
const int MOD = 1000000;
int i,n,a,sum = 0,re;
scanf("%d",&n);
for(i = 1;i<=n;i++)
{
re = 1;
for(a = 1;a<=i;a++)
re = re*a%MOD; //不能写成 re *= a%MOD; !!!!!
sum =(sum+re)%MOD; //应先算加法后取余,不能直接取余,同理,不能写成sum += re%MOD!!!
}
printf("%d\n",sum);
}