利用計算機進行數值計算,有時會遇到這樣的問題:有些計算要求精度高,希望計算的數的位數可達幾十位甚至幾百位,雖然計算機的計算精度也算較高了,但因受到硬體的限制,往往達不到實際問題所要求的精度。我們可以利用程式設計的方法去實現這樣的高精度計算。介紹常用的幾種高精度計算的方法。
高精度計算中需要處理好以下幾個問題:
資料的接收和存貯:當輸入的數很長時,可採用字串方式輸入,這樣可輸入數字很長的數,利用字串函式和操作運算,將每一位數取出,存入陣列中。
void init(int a) //傳入乙個陣列
另一種方法是直接用迴圈加陣列方法輸入資料。
void init(inta) a[
0] =_size ;
for (int i = 1; i <= _size; i++)
}
位數的確定:接收時往往是用字串的,所以它的位數就等於字串的長度。
//核心思想
c[i] = a[i] +b[i];
if (c[i] >= 10)//
核心演算法**
int c[100
];void add(int a, int b) //
a,b,c都為陣列,分別儲存被加數、加數、結果
}
【例1】高精度加法。輸入兩個正整數,求它們的和。
【分析】 輸入兩個數到兩個變數中,然後用賦值語句求它們的和,輸出。但是,我們知道,在c++語言中任何資料型別都有一定的表示範圍。而當兩個被加數很大時,上述演算法顯然不能求出精確解,因此我們需要尋求另外一種方法。在讀小學時,我們做加法都採用豎式方法,如圖1。 這樣,我們方便寫出兩個整數相加的演算法。
a3a2a1
+ b3b2b1
c4c3c2c1
#include #include#include
using
namespace
std;
intmain()
c[lenc] =x;
if (c[lenc] == 0
) lenc--; //
處理最高進製
for (i = lenc; i >= 1; i--)
cout
<< c[i]; //
輸出結果
cout
"pause");
return0;
}
if (a[i] c[i] = a[i] - b[i];
【例2】高精度減法。輸入兩個正整數,求它們的差。
#include #include#include
using
namespace
std;
intmain()
lena =strlen(n1);
lenb =strlen(n2);
for (i = 0; i <= lena - 1; i++)
a[lena - i] = int(n1[i] - '
0'); //
被減數放入a陣列
for (i = 0; i <= lenb - 1; i++)
b[lenb - i] = int(n2[i] - '
0'); //
減數放入b陣列
i = 1
;
while (i <= lena || i <=lenb)
c[i] = a[i] - b[i]; //
對應位相減
i++;
}lenc =i;
while ((c[lenc] == 0) && (lenc > 1
)) lenc--; //
最高位的0不輸出
for (i = lenc; i >= 1; i--)
cout
<< c[i]; //
輸出結果
cout
"pause");
return0;
}
c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1];x = c[i + j - 1] / 10
;c[i + j - 1] %= 10;
商和餘數處理:視被除數和除數的位數情況進行處理
高精度計算
最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...
高精度計算
include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...
高精度計算
一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...