代码中包换了许多switch语句,其中一部分是用来算个位数字乘了n遍之后的个位数,可能有同学说,你这不是相当于手算数据了吗,不过这些都是极其简单的单位位数字乘积问题,全部改成循环也只会多20次左右的运算,而且数据很好算,没必要非使用循环。
下面给出代码:
#include <stdio.h>
#include <stdlib.h>
int num3=0,num7=0,num9=0;
void cal(int n)
{
int t;
t=n%10;
switch(t)
{
case 9:num9++;
case 8:;
case 7:num7++;
case 6:;
case 5:;
case 4:;
case 3:num3++;
default:;
}
t=n/10;
num3=(num3+t)%4;
num7=(num7+t)%4;
num9=(num9+t)%2;
}
int main()
{
int n,i=2,j,t,zh=1,la,num2=0,num5=0;
scanf("%d",&n);
t=n;
while(t>0)
{
t=t/2;
num2+=t;
cal(t);
}
t=n;
while(t>0)
{
t=t/5;
num5+=t;
cal(t);
}
num2-=num5;
while (i*5<=n)
{
t=n/i;
j=5;
while (i*j<=n)
{
cal(t=t/5);
j*=5;
}
i*=2;
}
switch(n/10%2)
{
case 1:la=9;break;
case 0:la=1;break;
}
if (n%10==9) zh=9;
else if(n%10>=7) zh=7;
else if(n%10>=3) zh=3;
switch(zh)
{
case 9:la=la*9%10;break;
case 7:break;
case 3:la=la*3%10;break;
default:;
}
switch(num2%4)
{
case 0:la=la*6%10;break;
case 1:la=la*2%10;break;
case 2:la=la*4%10;break;
case 3:la=la*8%10;break;
}
switch(num3)
{
case 1:la=la*3%10;break;
case 2:la=la*9%10;break;
case 3:la=la*7%10;break;
default:;
}
switch(num7)
{
case 1:la=la*7%10;break;
case 2:la=la*9%10;break;
case 3:la=la*3%10;break;
default:;
}
switch(num9)
{
case 1:la=la*9%10;break;
default:;
}
printf("%d\n",la);
return 0;
}
测试点1 Accepted / 4ms / 2052kB
测试点2 Accepted / 3ms / 2052kB
测试点3 Accepted / 5ms / 2052kB
测试点4 Accepted / 6ms / 2052kB
测试点5 Accepted / 4ms / 2052kB
测试点6 Accepted / 4ms / 2052kB
测试点7 Accepted / 5ms / 2052kB
测试点8 Accepted / 6ms / 2052kB
测试点9 Accepted / 5ms / 2052kB
测试点10 Accepted / 6ms / 2052kB