由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算。
實現高精度數值計算,雖然不能利用程式語言提供的基本數值資料型別,但是可以利用字串儲存高精度數,計算的結果同樣儲存在字串中,將高精度數運算轉化為字串運算。以下列舉出高精度數相關運算。
1.大數加法
[cpp]view plain
copy
print?
/*
* 高精度數
* 結果儲存在字串a中,字串a初始為0
* 計算結束,將字串a翻轉即為高精度數a,b的和
*/void add(char *a, char *b)
while(i < la) //length of a is greater than b
while(j < lb) //length of b is greater than a
if(inc != 0) //at last,if the carry is not 0,store it into a
a[k++] = inc + '0';
strrev(a);
}
2.大數減法
大數減法相對加法較為複雜,但是只要注意借位操作的正確性,還是能夠較為輕鬆寫出正確的大數減法運算的。
[cpp]view plain
copy
print?
//高精度數減法
string sub(string num1, string num2)
k=0;
for(i = len1 - 1; i >= 0; i--)
a[k++] = num1[i] - '0';
k = 0;
for(i = len2 - 1; i >= 0; i--)
b[k++] = num2[i] - '0';
for(i = 0; i <= len - 1; i++)
else
a[i] = a[i] - b[i];
} while(a[len] == 0 && len > 0 || len >= max)
len--;
for(i = len; i >= 0; i--)
return ans;
}
3.大數乘法
大數乘法利用了大數加法的思想,需要注意的是進製的操作。
[cpp]view plain
copy
print?
/** 返回兩個大數相乘的結果
*/string multiple(string a, string b)
if(remain != 0)
tmp = 0;
m = result.length() - (a.length() - i);
n = str.length() - 1;
remain = 0;
while(m >= 0 && n >= 0) //add str to result
while(m >= 0)
while(n >= 0)
if(remain != 0)
} return result;
}
演算法 高精度乘法2(高精度乘高精度)
題目描述 高精度乘,求兩個很大的非負整數相乘的結果。輸入 2個非負整數,每個一行,每個整數不超過240位。輸出 乙個整數,表示相乘的結果。例子 為了和演算法對應方便,用上面數乘下面數的方法12 5 2512 5502 5312 5為了運算方便,將上面兩數倒置,得到的結果也為倒序下標0 1234 56...
高精度演算法 791 高精度加法
給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35注意點 1.兩個整數較大,用字串來存,這樣的話,可以呼叫它的size 方法 2.將兩個大的整數,存入vector陣列中,最好把整數...
高精度演算法
任務 高精度,計算大數乘小數 引數 乘法函式mul引數為 被乘數a,儲存最終結果的ans陣列,乘數b 結果 ans陣列中ans 0 為最高位,以此類推 include include using namespace std void mul char a,char ans,int b 任務 高精度,...