輸入整數a和b(0<=a<=3000,1<=b<=3000),輸出a/b的循環小數表示以及循環節長度。
例如,a=5,b=43,小數表示為0.(116279069767441860465),循環字節長度為21
這個題,忘了怎樣使a/b的結果保留多位小數!!!
具體方法為計算得出其多位小數(位數要足夠大),再判斷其周期,周期不會超過分母就在小於范圍內的周期一個一個判斷即可。
注意,該題循環不一定是從小數點后一位數開始,可能從之后才開始循環
應該想到豎式,那就是求小數點后n位的方法! a/b求出整數位,接着(a%b)*10/b即為小數點后一位,下一位a=a%b繼續上一步驟可得
寫吐了
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; int p[3000]; int main() { int a,b; while(scanf("%d %d",&a,&b)==2&&b){ int t=a%b,k=0,c,x; x=floor((double)a/b); printf("%d/%d=%d.",a,b,x); memset(p,0,sizeof(p)); for(int i=0;i<3000;i++){ //計算小數點后3000位小數 t*=10; p[i]=t/b; t%=b; } while(1){ //循環是從第k位開始 bool flag; for (c=1;c<=b;c++){ //周期c是大於0且小於等於b的人一個數 flag=true; for (int j= 0;j<3000-k;j++) if(p[j+k]!=p[j%c+k]){ //j%c+k為第一個周期 flag=false; break; } if(flag)break; //cout<<c<<" *"<<k<<endl; } if(flag){ for(int j=0;j<k;j++)printf("%d",p[j]); printf("("); if (c<= 50)for(int j=k;j<c+k;j++)printf("%d",p[j]); else{ for(int j=k;j<k+50;j++)printf("%d",p[j]); printf("..."); } printf(")\n"); printf(" %d = number of digits in repeating cycle\n\n",c); break; } k++; } } //system("pause"); return 0; }
