大整数的加减乘法运算
415 字符串相加(10进制或36位加法)-字节高频
给定两个字符串string num1
和string num2
,求两个的加法,其实即为大整数加法
//10进制加法
string addStrings(string num1, string num2) {
int i = num1.size()-1;
int j = num2.size()-1;
int carry = 0;
string res;
while(i>=0||j>=0||carry){
int x=(i>=0)?num1[i]-'0':0;
int y=(j>=0)?num2[j]-'0':0;
int temp=x+y+carry;
carry = temp / 10;
res+=temp%10+'0';
i--;
j--;
}
reverse(res.begin(),res.end());
return res;
}
//十进制中字符变为数字减‘0’,数字变为字符加'0';
//36进制加法 设置两个函数来实现数字和字符之间的转换
//给定0-9,a-z表示36为进制,求加法,不能转换为数字之后相加在转换为字符;
int getInt(char ch){
if('0'<=ch&&ch<='9') return ch-'0';
else return ch-'a'+10;
}
char getChar(int i){
if(i<=9) return i+'0';
else return i-10+'a';
}
string addThirtySixStrings(string num1, string num2) {
int i=num1.size()-1;
int j=num2.size()-1;
int carry=0;
string res;
while(i>=0||j>=0||carry){
int x=(i>=0)?getInt(num1[i]):0;
int y=(j>=0)?getInt(num2[j]):0;
int temp=x+y+carry;
carry=temp/36;
res+=getChar(temp%36);
i--;
j--;
}
reverse(res.begin(),res.end());
return res;
}
43 .字符串相乘
class Solution {
public:
//大数加法,从后向前开始加
string addstring(string num1,string num2){
int i=num1.size()-1;
int j=num2.size()-1;
int carry=0;
string res="";
while(i>=0||j>=0||carry){
int x=(i>=0)?num1[i]-'0':0;
int y=(j>=0)?num2[j]-'0':0;
int d=x+y+carry;
carry=d/10;
res+=d%10+'0';
i--;
j--;
}
reverse(res.begin(),res.end());
return res;
}
//123*456,可以等价为123*6+123*5*10+123*4*100;
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0") return "0";
int len1=num1.size();
int len2=num2.size();
string ans="";
for(int j=len2-1;j>=0;j--){
string t="";
int carry=0;
for(int i=len1-1;i>=0;i--){
int d=(num1[i]-'0')*(num2[j]-'0')+carry;
carry=d/10;
t+=d%10+'0';
}
if(carry) t+=carry+'0';
//得到123*6的结果;
reverse(t.begin(),t.end());
int coffe=len2-j-1;
//在后面添加对应进位上的‘0’;
if(coffe>0) t+=string(coffe,'0');
ans=addstring(ans,t);
}
return ans;
}
};
字符串相减
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
string subStrings(string num1, string num2) {
int i=num1.size()-1;
int j=num2.size()-1;
string res="";
int carry=0;
while(i>=0||j>=0||carry){
int x=(i>=0)?num1[i]-'0':0;
int y=(j>=0)?num2[j]-'0':0;
int d=x-y-carry;
carry=(d<0);
res+=d+10*carry+'0';
i--;
j--;
}
for(int i=res.size()-1;i>=0;i--){
if(res[i]=='0') res.pop_back();
else break;
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
int len1,len2;
string a,b;
cin>>a>>b;
string res;
if(a.size()>b.size()){
cout<<"结果为:"<<subStrings(a,b)<<endl;
}else if(a.size()<b.size()){
cout<<"结果为:-"<<subStrings(b,a)<<endl;
}else{
for(int i=a.size()-1;i>=0;i--){
if(a[i]==b[i]) continue;
if(a[i]>b[i]) {
cout<<"结果为:"<<subStrings(a,b)<<endl;
break;
}
if(a[i]<b[i]){
cout<<"结果为:-"<<subStrings(b,a)<<endl;
break;
}
}
}
return 0;
}