做这题前要确定两件事:
1、无限不循环小数即无理数(无循环节),不能写成两整数之比。所以1/n的形式必定有循环节。
2、一个分母为n的循环节位数最多不超过n - 1。
接着就可以用除法机制打哈希表,注意保存的并非余数而是n - 1个数中已经出现过的数。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long LL;
const int N = 100005;
const int INF = 1e8;
int main()
{
// freopen("in.txt", "r", stdin);
int t, n, vis[N];
scanf("%d", &t);
while(t --)
{
scanf("%d", &n);
if(n < 0)
{
printf("-");
n *= -1;
}
if(n == 1)
{
printf("1\n");
continue;
}
memset(vis, 0, sizeof(vis));
int mod = 1;
vis[mod] = 1;
printf("0.");
while(mod)
{
mod *= 10;
printf("%d", mod / n);
mod %= n;
if(vis[mod]) break;
vis[mod] = 1;
}
printf("\n");
}
return 0;
}