C語言實現浮點除法(高精度)
阿新 • • 發佈:2019-02-13
要求:由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就
需要自己設計實現方法。
(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
需要自己設計實現方法。
(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; }