求一個分數的迴圈節
阿新 • • 發佈:2018-11-01
(某年複試真題)編寫完整的函式,輸入正整數N和D,如果N/D為無限迴圈小數,輸出時小數點後面的第一個迴圈節用括號括起來,不顯示後面的迴圈;不為迴圈小數則正常顯示。(25分)
如 :3/4=0.75;5/6=0.8(3);10/3=3.(3)
思路:
分別用x和y表示分子和分母,先求出整數部分x div y和餘數部分x mod y,
那麼小數部分就是重複將餘數部分乘以10再進行整除運算和求餘運算,直到
出現迴圈或餘數為0時結束(類似於輾轉相除,但是y的值不變,x的變為每次的餘數乘以10)#include<stdio.h> #define N 1000 int main(){ int i,j,k; int sign = 0;//標誌,1表示有限小數,2表示有迴圈節 int circle_star,circle_end;//用於儲存迴圈節的開始到結束的下標 int numerator,denominator;//num分子,den分母 int div[N],mod[N];//div存整除數列,mod存餘數列 printf("請輸入分子與分母,以空格相隔:"); scanf("%d %d",&numerator,&denominator); div[0] = numerator / denominator; mod[0] = numerator % denominator; i=1; while(sign == 0){ mod[i] = mod[i-1] * 10 % denominator; div[i] = mod[i-1] * 10 / denominator; //printf("test:---%d,%d",div[0],mod[0]); if(mod[i]==0){ sign = 1; circle_end = i; }else{ for(j=0;j<i;j++){ if(mod[i] == mod[j]){ circle_end = i; circle_star = j; sign = 2; break; } } } i++; } for(i=0;i<=circle_end;i++){ printf("%d",div[i]); if(i==0&&circle_end>0)printf("."); if(i==circle_star && sign == 2)printf("("); } if(sign == 2) printf(")"); printf("\n"); }
結果: