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