【迴圈小數】輸出1/n. (是迴圈小數的,只輸出第一個迴圈節).
阿新 • • 發佈:2019-01-04
利用餘數和商解題
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(void){ int n,k,digit[100010],vis[100010]; while(cin>>n)){ if(n==1){ printf("1\n"); //為1的時候 即 1/1=1; } else if(n==-1){ printf("-1\n"); //為-1的時候 即 1/-1=-1; } else{ if(n<0){ cout<<"-"; n=-n; //轉換為正數 } memset(vis,0,sizeof(vis)); k=1; //即 1%n=1; /*k代表餘數*/ int cnt=0; //記錄陣列的下標 vis[k]=true; //判斷餘數是否已經出現過 /*若餘數出現過 則說明已經出現了迴圈節*/ cout<<"0."; while(k){ k*=10; //相當於每次在餘數後添加個0 digit[cnt++]=k/n; //用資料記錄商 k%=n; //求每次運算的的餘數 if(vis[k]==true)break; //找到迴圈節 vis[k]=true; } for(int i=0;i<cnt;i++){ cout<<digit[i]; } cout<<endl; } } return 0; }
拓展: 輸出m/n.(是迴圈小數的,只輸出第一個迴圈節).
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(void){ int m,n,k,digit[100010],vis[100010]; while(cin>>m>>n){ if(m<0&&n>0){ cout<<"-"; m=-m; } else if(m>0&&n<0){ cout<<"-"; n=-n; } memset(vis,0,sizeof(vis)); k=m%n; int cnt=0; vis[k]=true; if(m%n==0){ cout<<m/n; } else{ cout<<m/n<<"."; } while(k){ k*=10; digit[cnt++]=k/n; k%=n; if(vis[k]==true)break; vis[k]=true; } for(int i=0;i<cnt;i++){ cout<<digit[i]; } cout<<endl; } return 0; }