1. 程式人生 > >資訊學奧賽系列教程:高精度計算

資訊學奧賽系列教程:高精度計算

為什麼要需要高精度計算?

     每種計算機語言的基本資料型別,都有一定的範圍限制,在一些科學計算中,當需要運算的算數(加數、減數、乘數、除數)大於基本資料型別所能表示的範圍時,需要通過演算法來實現這些運算,比如200位的兩個數相乘

高精度計算需要解決的問題:

1、資料的輸入和儲存   

 通常情況下,採用字元或者字串方式輸入,用陣列來儲存輸入數的每個位數上的數字

  如“45654756”

  第一種方法,定義一個結構體,結構體中包含一個數組,和一個長度

  第二種方式,只用一個數組,儲存,陣列的第0個元素儲存該數的位數

   本人認為第二種方式更為簡潔,更符合使用習慣

    採用“倒序”儲存,是將個位放在最前,以便和其他數計算時,位數對齊

//第一種方式,用結構體
struct{
  int len;//表示這個數的位數
  int num[6,5,7,4,5,6,5,4];//儲存這個數各位數上的數字
}
第二種方式:用陣列的第0位儲存該數的位數
num[8,6,5,7,4,5,6,5,4]

以下是輸入字串,將數儲存到陣列的程式碼:

#include <iostream>
#include <cstring>
using namespace
std; const int LEN=500; int aa[LEN]; void inputNum(string ss,int a[]); //輸入需要計算的數儲存到陣列 void printArr(int a[]) //將一個數列印輸出 int main() { string s1 ="36895434535"; inputNum(s1,aa); printArr(aa); return 0; } void inputNum(string ss,int a[]) { int len = ss.length(); a[0] = len;
for (int i=0;i<len;i++) { a[len-i] = ss[i] - 48;//字元變成數字,並且倒序儲存 } } void printArr(int a[]) { for (int i=a[0];i>0;i--) { cout<<a[i]; } cout<<endl; }

2、運算過程:

        根據計算要求,運算過程在後續課程介紹