AOJ : 2049 - Headstrong Student
問題概要
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2049
XとYが入力されます.
X/Yを計算し, 循環小数となるのであれば, 小数点から循環開始の桁までの桁数と, 循環開始から終了までの桁数を答えます.
循環小数とならないのであれば, 小数点以下何桁であるかを出力し, その右に0を出力します(循環部はないという意味で).
アルゴリズム
Period (http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0113&lang=jp) の問題を少し改良するだけで通ります.
昔解いたことがあるコードをそのまま持ってきて解きました.
僕の解法は, 公式講評の解法(1)の方を使って解いていたようです.
プログラム
#include <stdio.h> #include <string.h> int a[1000001]; int main(void){ int i,j,x,y,p,q,flg; while(scanf("%d%d",&x,&y) && (x||y)){ flg = 0; //1:循環する 0:循環しない memset(a,-1,sizeof(a)); for(i=0;;i++){ x = x - y * (x / y); if(x == 0) break; if(a[x] != -1){ flg = 1; j = a[x]; break; } a[x] = i; x *= 10; } printf("%d %d\n",flg ? j : i, flg ? i-j : 0); } return 0; }