高精度計算采用模擬列豎式法,
一般計算用正數,對于負數,處理符號位,
1.高精度數的存盤
基本思想
用陣列存放和表示高精度整數,一個陣列元素,存放高精度整數中的一位,
為了便于計算,將數由低位到高位依次存在陣列下標對應由低到高的位置上,其中,陣列的第0個下標對應位置存盤該數的位數,
#include<stdio.h>
#include<string.h>
#define MAX_LEN 200
int sz[MAX_LEN + 10];
char szLine[MAX_LEN + 10];
int main()
{
int len, i;
scanf("%s", szLine);
memset(sz, 0, sizeof(sz));/*陣列清零*/
sz[0] = strlen(szLine);
for (i = 1; i <= sz[0]; i++) {
sz[i] = szLine[sz[0] - i] - '0';
}
return 0;
}
2.高精度數比較
int cmp(int a[], int b[]) {
int i;
if (a[0] > b[0]) {
return 1;
}
else if (a[0] < b[0]) {
return -1;
}
for (i = a[0]; i >= 1; i--) {
if (a[i] > b[i]) {
return 1;
}
else if (a[i] < b[i]) {
return -1;
}
}
return 0;
}
3.高精度加法
void plus(int a[], int b[]) {
int i;
if (a[0] < b[0]) {
a[0] = b[0];
}
for (i = 1; i <= a[0]; i++) {
a[i] += b[i];
if (a[i] >= 10) {
a[i + 1]++;
a[i] -= 10;
}
}
if (a[a[0] + 1] != 0) {
a[0]++;
}
}
4.高精度減法
int minus(int a[], int b[]) {
int i;
if (cmp(a, b) == 0) {
memset(a, 0, sizeof(a));
a[0] = 1;
return 0;
}
else if (cmp(a, b) > 0) {
for (i = 1; i <= a[0]; i++) {
a[i] = a[i] - b[i];
if (a[i] < 0) {
a[i + 1] -= 1;
a[i] += 10;
}
}
while (a[a[0]] == 0) {
a[0]--;
}
return 1;
}
else {
minus(b, a);
for (i = 0; i <= b[0]; i++) {
a[i] = b[i];
}
return -1;
}
}/*回傳值表示減法結果的符號*/
參考資料:
1.從零開始學演算法:高精度計算
2.高精度演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45027.html
標籤:C
