讨论 / 最末非0位的最快算法
反逆のR 2014-03-07 06:16:20
点我顶贴 收藏 删除
我看了一下,截止2014年3月7日,RQ的历史最快纪录是我的全部测评点只需48ms。

代码中包换了许多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 反逆のR@2014-03-11 06:39:30
回复 删除
附评测结果

测试点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

查看更多回复
提交回复