《演算法競賽入門經典》 習題3-8 迴圈小數
阿新 • • 發佈:2018-12-15
《演算法競賽入門經典》 習題3-8 迴圈小數
輸入整數a和b(0<=a<=3000,1<=b<=3000),輸出a/b的迴圈小數表示以及迴圈節長度。例如a=5,b=43,小數表示為0.(116279069767441860465),迴圈節長度為21.
#include<stdio.h> #include<memory.h> int main() { int a,b; while(scanf("%d %d",&a,&b)!=EOF) { int count=0; int c=a; int ans[3010],repet[3010],s[3010]; memset(ans,0,sizeof(ans)); memset(repet,0,sizeof(repet)); ans[count++]=a/b; //記錄整數部分 a=a%b; //取餘數 while(!repet[a]&&a) /*當出現相同數時,迴圈節結束,跳出迴圈,或餘數為0時,跳出*/ { repet[a]=count; s[count]=a; ans[count++]=10*a/b; //記錄小數 a=10*a%b; } printf("%d/%d=%d.",c,b,ans[0]); for(int i=1;i<count&&i<=50;i++) { if(a==s[i]&&a) printf("("); // a不等於0,說明有迴圈節 printf("%d",ans[i]); } if(!a) printf("(0"); //如果沒有迴圈節,迴圈為0 if(count>50) printf("..."); printf(")\n"); printf(" %d = number of digits in repeating cycle\n\n",!a?1:count-repet[a]); } return 0; }
怎麼寫小數呢,可以算幾個數試試,就比如5/2,先取整數2,取餘1,1*10/2,取到第一個小數5,怎麼算迴圈呢,當後面的小數與第一個小數重複時,就說明迴圈到了。
(イヤリングが欲しい)