一、高精度加法
(一)思路:红色的1 2 3 是重点。
1.输入输出
2.关系
(二)我的代码
#include <iostream>
#include <cstring>
using namespace std;
const int N=100000;
int main(){
char str1[N+10],str2[N+10];
int a[N+10],b[N+10],c[N+15],t[N+10]={0};
int len1,len2,len_m,len3;
scanf("%s",str1);
scanf("%s",str2);
len1=strlen(str1);
len2=strlen(str2);
len_m=max(len1,len2);
len3=len_m;
for(int i=1;i<=len1;i++){
int j=len1-i;
a[i]=str1[j]-'0';
}
for(int i=1;i<=len2;i++){
int j=len2-i;
b[i]=str2[j]-'0';
}
for(int i=1;i<=len_m;i++){
c[i]=a[i]+b[i]+t[i-1];
if(i<len_m){
if(c[i]>=10){
c[i]-=10;
t[i]=1;
}
}
else{
if(c[i]>=10){
c[i]-=10;
c[i+1]=1;
len3++;
}
}
}
for(int i=len3;i>=1;i--)
cout<<c[i];
return 0;
}
(三)yxc的模板代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);//保证大数是操作数1
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
int main()
{
string a, b;
vector<int> A, B;
cin >> 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');
auto C = add(A, B);
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
cout << endl;
return 0;
}
学习到的:
1.用到了STL
1).STL使字符串的定义,输入(读入)更简便
string a, b;
cin>>a>>b;
2).vector:cplusplus
- 声明:
vector<int> A;
注意vector与之间无空格!后面的变量名或者函数名是有空格的。 a.size();
A.push_back(a[i] - '0');
a.push_back(100);
3).auto C = add(A, B);
我们发现add函数返回值是一个int型的vector。
返回值不一定是一个数,可以返回类型。
4).auto CppReference
是让编译器自己推断类型是什么,这里相当于写 vector
2.我的代码t作为进位,单独村里个数组,模板中,t是一个临时的值“”除10取余存入C数组,除10的值作为作为下次进位”,减少了空间。
好绕!!!
二、高精度减法
(一)我的代码
1.借鉴上面的yxc的代码,尝试使用了STL写。
报了几次错,进行了修改。报错改正的部分写在了注释里面,下一次写代码时,要注意。
#include <iostream>
#include <vector>
using namespace std;
vector<int> jian(vector<int> &A,vector<int> &B);//取地址符号没有写导致error
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');//push_back中间的下划线没有写导致error
for(int i=b.size()-1;i>=0;i++) B.push_back(b[i]-'0');
int f=1;
if(B.size()>A.size()) f=0;
else if (B.size()==A.size()){
for(int i=A.size()-1;i>=0;i--)
if(A[i]<B[i]) f=0;
}
if(f==1){//f==1时A数租对应的数字值大于B
auto C=jian(A,B);
for(int i=C.size()-1;i>=0;i--)
cout<<C[i];
}
else {
auto C=jian(B,A);//保证函数中的第一操作数是值大的数对应的数组
for(int i=C.size()-1;i>=0;i--)
cout<<-C[i];
}
return 0;
}
vector<int> jian(vector<int> &A,vector<int> &B){
int t=0;
vector<int> C;
for(int i=0;i<=A.size()-1;i++){//传入时已经保证操作数1的数组对应着更大的数
if(B.size()-1<i) B.push_back(0);//B很可能比A短,因此加上这一句
C[i]=A[i]-B[i]-t;
if(C[i]<0){
C[i]+=10;
t=1;
}
}
return C;
}
2.运行结果