刷题OJ 网站!验证你的代码是否正确!!!
一、高精度加法
思想:
- 把大数存到字符串;
- 字符串的每个字符数字都通过ASCII转换存到数组,
- 注意的是要低位存在数组开头:a[i] = s[len-i-1]-‘0’;
- 获取最大的数长度:max(len1,len2) ;
- 加法进位的算式:
- ① a[i+1] += a[i]/10;
- ② a[i] %= 10;
- 数字溢出,长度+1;
- 反向输出结果;
代码实现
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[10000],b[10000],c[100001];
int main(){
// 1.输入值,长度
cin>>s1>>s2;
int len1 = s1.size();
int len2 = s2.size();
// 2.把字符转为整数存到数组
// 注意要个位存到数组开头
for(int i=0;i<len1;i++) a[i] = s1[len1-i-1]-'0';
for(int i=0;i<len2;i++) b[i] = s2[len2-i-1]-'0';
// 3.获取最大的数。
int len = max(len1,len2);
// 对各个位数进行相加
for(int i=0;i<len;i++) c[i]=a[i]+b[i];
//4.进位
for(int i=0;i<len;i++){
c[i+1] += c[i]/10;
c[i] %= 10;
}
//5.溢出
while(c[len]==0 && len>0){
len--;
}
if(c[len]>0) len++;
//6.反向输出
for(int i=len-1;i>=0;i--) cout<<c[i];
return 0;
}
二、高精度减法
减法是这样要求的,当两数相减<0,要输出带负 ‘-’ 号!
思想:
- 输入大数;
- 判断大小,固定s1恒大于s2:
if(s1.size()<s2.size() || s1.size()==s2.size() && s1<s2){ swap(s1,s2); //交换值 cout<<"-"; }
- 获取长度;
- 字符变整数:
a[i] = s1[len1-i-1]-'0';- 减法运算:
if(a[i]<b[i]){ a[i+1]--; //上位-- a[i]+=10; // 本位+10 } c[i] = a[i]-b[i];
- 去除前导零;
- 反向输出;
代码实现
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[10000],b[10000],c[10000];
int main(){
// 1.输入值
cin>>s1>>s2;
// 2.判断大小,固定s1恒大于s2
if(s1.size()<s2.size() || s1.size()==s2.size() && s1<s2){
swap(s1,s2); //交换值
cout<<"-";
}
// 3.获取长度
int len1 = s1.size();
int len2 = s2.size();
// 4.字符变整数
for(int i=0;i<len1;i++){ a[i] = s1[len1-i-1]-'0';
for(int i=0;i<len2;i++){ b[i] = s2[len2-i-1]-'0';
//5.减法运算
for(int i=0;i<len1;i++){
if(a[i]<b[i]){
a[i+1]--; //上位--
a[i]+=10; // 本位+10
}
c[i] = a[i]-b[i];
}
//6去除前导零
while(c[len1-1]==0 && len1>1){
len1--;
}
//7.反向输出
for(int i=len1-1;i>=0;i--) cout<<c[i];
return 0;
}