目录
(一)高精度四则运算(1)题目-加法(1.2)代码(2)题目-减法(2.2)代码(3)题目-乘法(3.2)代码(4)题目-除法(4.2)代码
(二)总结
(一)高精度四则运算
(1)题目-加法
给定两个正整数,计算它们的和。
输入格式 共两行,每行包含一个整数。
输出格式 共一行,包含所求的和。
数据范围 1≤整数长度≤100000
输入样例:
12 23
输出样例:
35
(1.2)代码
#include<iostream>
using namespace std
;
#include<vector>
vector
<int> add(vector
<int> &A
,vector
<int>&B
){
int t
=0;
vector
<int> C
;
for(int i
=0;i
<A
.size()||i
<B
.size()||t
;i
++){
if(i
<A
.size())t
+=A
[i
];
if(i
<B
.size())t
+=B
[i
];
C
.push_back(t
%10);
t
/=10;
}
return C
;
}
int main(){
string a
,b
;
cin
>>a
>>b
;
vector
<int>A
,B
;
for(int i
=a
.size()-1;i
>=0;i
--)A
.push_back(a
[i
]-'0');
for(int i
=b
.size()-1;i
>=0;i
--)B
.push_back(b
[i
]-'0');
vector
<int> C
=add(A
,B
);
for(int i
=C
.size()-1;i
>=0;i
--)cout
<<C
[i
];
return 0;
}
(2)题目-减法
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式 共两行,每行包含一个整数。
输出格式 共一行,包含所求的差。
数据范围 1≤整数长度≤105
输入样例:
32 11
输出样例:
21
(2.2)代码
#include<iostream>
using namespace std
;
#include<vector>
bool cmp(vector
<int> &A
,vector
<int> &B
){
if(A
.size()!=B
.size())return A
.size()>B
.size();
for(int i
=A
.size()-1;i
>=0;i
--){
if(A
[i
]!=B
[i
])return A
[i
]>B
[i
];
}
return true;
}
vector
<int> sub(vector
<int> &A
,vector
<int>&B
)
{
vector
<int> C
;
for(int i
=0,t
=0;i
<A
.size();i
++){
t
+=A
[i
];
if(i
<B
.size())t
-=B
[i
];
C
.push_back((t
+10)%10);
if(t
<0)t
=-1;
else t
=0;
}
while(C
.size()>1&&C
.back()==0)C
.pop_back();
return C
;
}
int main(){
string a
,b
;
cin
>>a
>>b
;
vector
<int> A
,B
,C
;
for(int i
=a
.size()-1;i
>=0;i
--)A
.push_back(a
[i
]-'0');
for(int i
=b
.size()-1;i
>=0;i
--)B
.push_back(b
[i
]-'0');
if(cmp(A
,B
)){
C
=sub(A
,B
);
}
else{
C
=sub(B
,A
);
cout
<<"-";
}
for(int i
=C
.size()-1;i
>=0;i
--)cout
<<C
[i
];
return 0;
}
(3)题目-乘法
给定两个正整数A和B,请你计算A * B的值。
输入格式 共两行,第一行包含整数A,第二行包含整数B。
输出格式 共一行,包含A * B的值。
数据范围 1≤A的长度≤100000 , 0≤B≤10000
输入样例:
2 3
输出样例:
6
(3.2)代码
#include<iostream>
using namespace std
;
#include<vector>
vector
<int> mul(vector
<int> &A
, int b
)
{
vector
<int> C
;
int t
= 0;
for (int i
= 0; i
< A
.size() || t
; i
++ )
{
if (i
< A
.size()) t
+= A
[i
] * b
;
C
.push_back(t
% 10);
t
/= 10;
}
while(C
.size()>1&&C
.back()==0)C
.pop_back();
return C
;
}
int main(){
string a
;
int b
;
cin
>>a
>>b
;
vector
<int>A
;
for(int i
=a
.size()-1;i
>=0;i
--)A
.push_back(a
[i
]-'0');
vector
<int> C
=mul(A
,b
);
for(int i
=C
.size()-1;i
>=0;i
--)cout
<<C
[i
];
return 0;
}
(4)题目-除法
给定两个非负整数A,B,请你计算 A / B的商和余数。
输入格式 共两行,第一行包含整数A,第二行包含整数B。
输出格式 共两行,第一行输出所求的商,第二行输出所求余数。
数据范围 1≤A的长度≤100000 , 1≤B≤10000 B 一定不为0
输入样例:
7 2
输出样例:
3 1
(4.2)代码
#include<iostream>
using namespace std
;
#include<algorithm>
#include<vector>
vector
<int> div(vector
<int> &A
,int b
,int &r
){
vector
<int > C
;
for(int i
=A
.size()-1;i
>=0;i
--){
r
=r
*10+A
[i
];
C
.push_back(r
/b
);
r
%=b
;
}
reverse(C
.begin(),C
.end());
while(C
.size()>1&&C
.back()==0)C
.pop_back();
return C
;
}
int main(){
string a
;
int b
,r
=0;
cin
>>a
>>b
;
vector
<int> A
,C
;
for(int i
=a
.size()-1;i
>=0;i
--)A
.push_back(a
[i
]-'0');
C
=div(A
,b
,r
);
for(int i
=C
.size()-1;i
>=0;i
--)cout
<<C
[i
];
cout
<<endl
<<r
;
return 0;
}
(二)总结
1.j加法中注意最后要判断t; 2.减法,乘法,除法要去除首位0,减法要注意A与B的大小; 3.堆区初始化变量会有初始值0或者false,而在栈区则随机; 4.reverse()函数在algorithm里面。
若有不正确之处,望大家指正,共同学习!谢谢!!!
本文参考网址