1. 程式人生 > >C語言實現浮點除法(高精度)

C語言實現浮點除法(高精度)

要求:由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就
需要自己設計實現方法。
(0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將
相除的結果存放在一維陣列中,陣列的每個元素存放一位十進位制數字。即商的第一位存放在
第一個元素中,第二位存放在第二個元素中,以此類推,就可以用陣列來表達一個高精度的
除法結果了。
如 16/19 的結果 0.8421052631...就可以依次存放 8、4、2、1、0、5、2、6、3、1...在數
組中。
而除法的過程,則可以模仿人工列豎式做除法的方式,先將被除數乘以 10,得到一位商以
後,將餘數乘以 10 作為下一輪計算的被除數:
160/19->8 餘 8
80/19->4 餘 4
... 當某次餘數為 0 時,則表明除盡。
現在,請寫一個程式,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多
小數點後 200 位。
輸入格式:
形如
a/b
的兩個數,其中 10<=a<b<100。
輸出格式:
形如
0.xxxxxxxxx
的小數,小數點後最多 200 位。輸出結束的時候要帶著回車換行。
輸入樣例:
16/19
輸出樣例:
0.842105263157894736842105263157894736842105263157894736842105263157894
73684210526315789473684210526315789473684210526315789473684210526315789

473684210526315789473684210526315789473684210526315789473684

程式碼如下:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    char c;
    int a,b,d,i=0,n[200];
    
    scanf("%d%c%d",&a,&c,&b);
    a=(a*10)/b;
    d=(a*10)%b;
    while (d&&i<=200) {
        n[i]=a;
        i++;
        d=(a*10)%b;
        if((a*10)/b==0)
            a=a*10;
        else
            a=(a*10)/b;
    }
    printf("0.");
    for (i=0; i<200; i++) {
         printf("%d",n[i]);
    }
    printf("\n");
    return 0;
}