高精度乘法計算
題目:
給出兩個正整數A和B,計算A*B的值。保證A和B的位數不超過500位。
思路:
主要記住計算乘法時,豎式計算每一個值對應的座標位置,如數字A和B的第一位相乘,則A的第一位就在第一個位置,第二位就在第二個位置;數字A和數字B的第二位相乘,A的第一位在第二個位置;以此類推;最後再將每個位置上的數字進位到單個數字。
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string A, B;
cin >> A >> B;
int C[1000];
memset(C, 0, 1000);
int len_A = A.size();
int len_B = B.size();
for (int i = 0; i < len_A; i++)
for (int j = 0; j < len_B; j++)
C[i+j] += (A[i] - '0') * (B[j] - '0');
for (int i = len_A + len_B - 2; i > 0; i--)
{
C[i-1] += C[i] / 10;
C[i] = C[i] % 10;
}
for (int i = 0; i <= len_A + len_B - 2; i++)
cout << C[i];
cout << endl;
return 0;
}
高精度加法計算
題目:
給出兩個正整數A和B,計算A+B的值。保證A和B的位數不超過500位。
思路:
/*
作者:時光機
題目:p3116 高精度練習之加法
沒啥區別,就是注意交換之後,長度也要跟着變化,所以應該把求長度的操作放在交換之後
19987787889 98776665
20086564554
但我的答案爲 19:86564554
就是9的後面不是10,是冒號
*/
#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;
int main()
{
string A, B;
cin >> A >> B;
if (A.size() < B.size())
swap(A, B);
int lenA = A.size();
int lenB = B.size();
char cal;
int more = 0;
for (int i = 0; i < lenA - lenB; i++)
B = '0' + B;
stack<int> C;
for (int i = lenA - 1; i >= 0; i--)
{
cal = A[i] + (B[i] - '0') + more;
more = cal > '9' ? 1 : 0;
if (cal > '9')
{
cal -= 10;
}
C.push(cal - '0');
}
if (more == 1)
C.push(1);
//for (int i = 0; i < C.size(); i++)
while(!C.empty())
{
cout << C.top();
C.pop();
}
return 0;
}
int main()
{
string A, B;
cin >> A >> B;
if (A.size() < B.size())
swap(A, B);
int lenA = A.size();
int lenB = B.size();
int more = 0;
char cal;
for (int i=lenA-1, j=lenB-1; j >= 0; j--, i--)
{
A[i] = A[i] + (B[j] - '0');
if (A[i] > '9')
{
A[i-1]++;
A[i] -= 10;
}
}
int pos = lenA - lenB - 1;//就是A比B多出來的一截的位置
while (A[pos] > '9' && pos != 0)
{
A[pos-1]++;
A[pos--] -= 10;
}
if (A[0] > '0')//防止對其長度的頭相加,導致溢出
{
A[0] -= 10;
cout << 1;
}
cout << A << endl;
return 0;
}
高精度減法計算
題目:
給出兩個正整數A和B,計算A-B的值。保證A和B的位數不超過500位。
思路:
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
int main()
{
string A, B;
cin >> A >> B;
if (A.size() < B.size() || (A.size() == B.size() && A < B))
{
cout << "-";
swap(A, B);
}
int lenA = A.size();
int lenB = B.size();
int less = 0;//是否向上借位
int cal;//用於計算
for (int i = 0; i < lenA - lenB; i++)
B = '0' + B;//填0,使得保持同長度相減
stack<int> C;
for (int i = lenA - 1; i >= 0; i--)
{
cal = A[i] - B[i] - less;//less 爲 0 或 1;
C.push(cal >= 0 ? cal : cal + 10);
less = cal >= 0 ? 0 : 1;
}
while (C.top() == 0)
C.pop();
while (!C.empty())
{
cout << C.top();
C.pop();
}
return 0;
}
int main()
{
string A, B;
cin >> A >> B;
if (A.size() < B.size() || (A.size() == B.size() && A < B))
{
cout << "-";
swap(A, B);
}
int lenA = A.size();
int lenB = B.size();
int less = 0;
for (int i = lenA-1, j = lenB-1; j >= 0; j--, i--)
{
A[i] = A[i] - (B[j] - 48);
if (A[i] < '0')
{
A[i] += 10;
A[i-1]--;
}
}
while (A.size() > 1 && A[0] == '0')
A.erase(0, 1);//從指定pos位置起,刪除字符長度爲n的子串
cout << A << endl;
return 0;
}