C趣味程序百例(14)計(jì)算分?jǐn)?shù)的精確值

字號:

47.計(jì)算分?jǐn)?shù)的精確值
     使用數(shù)組精確計(jì)算M/N(0    *問題分析與算法設(shè)計(jì)
     由于計(jì)算機(jī)字長的限制,常規(guī)的浮點(diǎn)運(yùn)算都有精度限制,為了得到高精度的計(jì)算結(jié)果,就必須自行設(shè)計(jì)實(shí)現(xiàn)方法。
     為了實(shí)現(xiàn)高精度的計(jì)算,可將商存放在一維數(shù)組中,數(shù)組的每個(gè)元素存放一位十進(jìn)制數(shù),即商的第一位存放在第一個(gè)元素中,商的第二位存放在第二個(gè)元素中....,依次類推。這樣就可以使用數(shù)組不表示一個(gè)高精度的計(jì)算結(jié)果。
     進(jìn)行除法運(yùn)算時(shí)可以模擬人的手工操作,即每次求出商的第一位后,將余數(shù)乘以10,再計(jì)算商的下一位,重復(fù)以上過程,當(dāng)某次計(jì)算后的余數(shù)為0 時(shí),表示M/N為有限不循環(huán)小數(shù)某次計(jì)算后的余數(shù)與前面的某個(gè)余數(shù)相同時(shí),則M/N為無限循環(huán)小數(shù),從該余數(shù)第一次出現(xiàn)之后所求得的各位數(shù)就是小數(shù)的循環(huán)節(jié)。
     程序具體實(shí)現(xiàn)時(shí),采用了數(shù)組和其它一些技巧來保存除法運(yùn)算所得到的余數(shù)和商的各位數(shù)。
    *程序與程序注釋
    #include
    int remainder[101],quotient[101]; /*remainder:存放除法的余數(shù); quotient:依次存放商的每一位*/
    void main()
    {
     int m,n,i,j;
     printf("Please input a fraction(m/n)(<0     scanf("%d/%d",&m,&n); /*輸入被除數(shù)和除數(shù)*/
     printf("%d/%d it's accuracy value is:0.",m,n);
     for(i=1;i<=100;i++) /*i: 商的位數(shù)*/
     {
     remainder[m]=i; /*m:除的余數(shù) remainder[m]:該余數(shù)對應(yīng)的商的位數(shù)*/
     m*=10; /*余數(shù)擴(kuò)大10位*/
     quotient[i]=m/n; /*商*/
     m=m%n; /*求余數(shù)*/
     if(m==0) /*余數(shù)為0 則表示是有限小數(shù)*/
     {
     for(j=1;j<=1;j++) printf("%d",quotient[j]); /*輸出商*/
     break; /*退出循環(huán)*/
     }
     if(remainder[m]!=0) /*若該余數(shù)對應(yīng)的位在前面已經(jīng)出現(xiàn)過*/
     {
     for(j=1;j<=i;j++) printf("%d",quotient[j]); /*則輸出循環(huán)小數(shù)*/
     printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]);
     printf("\tdigit to %d digit after decimal point.\n",i);
     /*輸出循環(huán)節(jié)的位置*/
     break; /*退出*/
     }
     }
    }