题意:输出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;
}