您的位置:首页 > 其它

2522:A simple problem

2015-09-26 09:33 148 查看
题目链接: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");
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: