NYOJ 330 一個簡單的數學題


一個簡單的數學題

時間限制: 3000 ms  |  內存限制: 65535 KB
難度: 3
描述
zyc最近迷上了數學,一天,dj想出了一道數學題來難住他。算出1/n,但zyc一時答不上來希望大家能編程幫助他。
輸入
第一行整數T,表示測試組數。后面T行,每行一個整數 n (1<=|n|<=10^5).
輸出
輸出1/n. (是循環小數的,只輸出第一個循環節).
樣例輸入
4
2
3
7
168
樣例輸出
0.5
0.3
0.142857
0.005952380

直接模擬求余數的方法,用一個數組記錄商,另外一個數組記錄余數是否出現過,如果出現過,說明是第二次循環的開始,在此處跳出循環即可。

#include<cstdio>
#include<cstring>
const int MAXN = 100005;
int a[MAXN], vis[MAXN];
int main()
{
int n, t, i;
scanf("%d",&t);
while(t--) {
memset(vis, 0, sizeof(vis));
scanf("%d",&n);
if(n < 0) {
printf("-");
n = -n;
}
if(n == 1) printf("1\n");
else {
int s = 1, num = 0;
vis[s] = 1;
while(1) {
s *= 10;
a[num++] = s / n;
s %= n;
if(vis[s] || s == 0) break; //余數再次出現或者余數為0(即可以整除)
vis[s] = 1;
}
printf("0.");
for(i = 0; i < num; i++)
printf("%d", a[i]);
printf("\n");
}
}
return 0;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com