题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2522
方法:hash
思路:这道题的思路不太好想,主要是要想到为什么会出现循环小数。我们可以思考一下整数除法,为什么会出现循环的商出现,根本原因是在除法过程中,每上一位商,留下的余数如果出现过,那么则意味着除法过程再次回到了起点,对应的商也就循环了。想明白这一点,就可以用hash记录余数出现的位置,一旦再次出现这个余数,则证明循环开始了。
难点:本题正常组织代码会有时间上的问题。尤其是memset函数非常耗时,需要合理安排其位置。并且使用memset(vis,0,(n+100)*sizeof(vis[0])); 这个方法会更快。
参考链接:http://blog.csdn.net/hnust_xiehonghao/article/details/8986565
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int hashset[1000000] = {0};
int main()
{
int t,n;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d",&n);
if(n == 1)
printf("1\n");
else
{
if(n<0)
{
printf("-");
n = -n;
}
memset(hashset,0,(n+100)*sizeof(hashset[0]));
printf("0.");
int z = 1;
while(z)
{
hashset[z] = 1;
z *= 10;
//cout<<z<<" ";
printf("%d",z/n);
z = z%n;
if(hashset[z]) break;
}
printf("\n");
}
}
}
}