大整数的加减乘法运算

大整数的加减乘法运算

415 字符串相加(10进制或36位加法)-字节高频

给定两个字符串string num1string 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;   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值