题目 : 求 1/n 是循环小数的,只输出第一个循环节
AC code:
#include<stdio.h>
char vec[1000100];
int main()
{
int temp,start,n,T,t,c2,c5,j,top;
scanf("%d",&T);
int num;
while(T--)
{
j=top=num=0;
temp=10;
scanf("%d",&n);
if(n==1||n==-1)
{
printf("%d\n",n);
continue;
}
printf(n>0?"0.":"-0.");
n=n>0?n:-n;
if(n%2!=0&&n%5!=0) start=1;
else
{
t=n,c2=0,c5=0;
while(t%2==0&&t!=0)
{
t/=2;
c2++;
}
while(t%5==0&&t!=0)
{
t/=5;
c5++;
}
if(t!=0) start=(c2>c5?c2:c5)+1;
}
while(1)
{
j++;
vec[top++]=temp/n+'0';
if(j==start) num=temp;
temp=(temp%n)*10;
if(temp==0|| temp==num) break;
}
vec[top++]=0;
puts(vec);
}
}
总结:这是我目前看到的最快的代码,值得学习,如果用一般思路进行编码,结果总是超时,数论方面的问题最终还是要依据其规律特性进行求解
一个最简分数化为小数有三种情况:
(1)如果分母只含有质因数2和5,那么这个分数一定能化成有限小数,并且小数部分的位数等于分母中质因数2与5中个数较多的那个数的个数;
(2)如果分母中只含有2与5以外的质因数,那么这个分数一定能化成纯循环小数;
(3)如果分母中既含有质因数2或5又含有以外的质因数,那么这个分数一定能化成混循环小数,并且不循环部分的位数等于分母中质因数2与5中个数较多的那个数的个数。