2522:A simple problem

题目链接: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");
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值