高精度乘法计算
题目:
给出两个正整数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;
}