关键是找到按数据计算的方法,特别是乘法,我自己想的就是按正常的乘法计算,比较复杂,给出的方法是先算出所有乘法的结果再进位,不容易出错。
另外要注意输出时,可能会有0开头的结果,要记得跳过开头的0。
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
bool Judge(vector<int> x, vector<int> y){
int m = x.size();
int n = y.size();
if(m < n) return false;
else if(m > n) return true;
else{
for(int i = m-1; i >= 0; i--){
if(x[i] < y[i]){
return false;
}else if(x[i] > y[i]){
return true;
}
}
}
return true;
}
void Add(vector<int> x, vector<int> y){
int m = x.size(), n = y.size();
stack<int> ans;
int carry = 0, tmp;
for(int i = 0; i < n; i++){
tmp = x[i] + y[i] + carry;
ans.push(tmp % 10);
carry = tmp / 10;
}
for(int i = n; i < m; i++){
tmp = x[i] + carry;
ans.push(tmp % 10);
carry = tmp / 10;
}
if(carry != 0){
ans.push(carry);
}
while(!ans.empty()){
cout << ans.top();
ans.pop();
}
cout << endl;
}
void Sub(vector<int> x, vector<int> y){
int m = x.size(), n = y.size();
stack<int> ans;
int carry = 0, tmp;
for(int i = 0; i < n; i++){
tmp = x[i] - y[i] - carry;
if(tmp < 0){
carry = 1;
tmp += 10;
}else{
carry = 0;
}
ans.push(tmp);
}
for(int i = n; i < m; i++){
tmp = x[i] - carry;
if(tmp < 0){
carry = 1;
tmp += 10;
}else{
carry = 0;
}
ans.push(tmp);
}
bool flag = false;
while(!ans.empty()){
//要注意有可能0开头,要去掉0
if(ans.top() == 0 && flag == false){
ans.pop();
}else{
flag = true;
cout << ans.top();
ans.pop();
}
}
cout << endl;
}
//注意乘法的写法
void Multiply(vector<int> x, vector<int> y){
int m = x.size(), n = y.size();
int carry = 0, tmp;
vector<int> ans(m + n, 0); //初始化为0
ans.push_back(0);
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
ans[i + j] += x[i] * y[j];
}
}
for(int i = 0; i < m + n + 2; i++){
if(ans[i] > 10){
ans[i+1] += ans[i] / 10;
ans[i] = ans[i] % 10;
}
}
//结果有可能以0开头
bool flag = false;
for(int i = m + n + 1; i >= 0; i--){
if(!flag && ans[i] == 0){
continue;
}
else{
flag = true;
cout << ans[i];
}
}
cout << endl;
}
int main(){
string a, b;
while(cin >> a >> b){
int m = a.size(), n = b.size();
vector<int> x, y;
for(int i = m-1; i >= 0; i--){
x.push_back(a[i] - '0');
}
for(int i = n-1; i >= 0; i--){
y.push_back(b[i] - '0');
}
if(m >= n){
Add(x, y);
}
else{
Add(y, x);
}
if(Judge(x, y))
Sub(x, y);
else{
cout<<"-";
Sub(y, x);
}
if(Judge(x, y))
Multiply(x, y);
else{
Multiply(y, x);
}
}
}
京公网安备 11010502036488号