A simple problem HDU-2522 【数学技巧】

题意:输出1/n,如果是循环的,那么输出第一个循环节

思路: 技巧:如果余数重复出现,那么该数字就是一个循环节的末端。

数据分析:(1<=|n|<=10^5) 注意到题目故意加了绝对值,所以要判断一下n的正负。

#include <bits/stdc++.h>
using namespace std;
bool vis[200000]; // 标记数组
int main(void)
{
    int t;
    cin >>t;
    while(t--)
    {
        memset(vis,false,sizeof(vis));
        int n;
        cin >> n;
        if(n<0)
        {
            printf("-");
            n=-n;
        }
        if(n==1) //如果是1要进行特判定,若进入else里跑1,那么输出会是0.1。else里输出的是小于1的情况。
        {
            printf("1\n");
            continue;
        }
        else
        {
            printf("0.");
            vis[0]=true;//vis[0]=true的原因是为了不多输出0!
            int m=1;// 至于为什么是m=1应该是 模拟除法而已。
            while(vis[m]==false)
            {
                vis[m]=true;
                m*=10;
                printf("%d",m/n);
                m%=n;
            }
        }
        puts("");
    }
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值