欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class23 高精度算法练习 mfy

时间:2024-09-22 21:40 作者:admin 点击:
// 1168 大整数加法#include bits/stdc++.husing namespace std;string delete0(string str){    int i=0;    while(istr.size()-1str[i]=='0') i++;    return str.substr(i);}string add(string n1,string n2){    reverse(n1.begin(),n1.end(
// 1168 大整数加法
#include <bits/stdc++.h>
using namespace std;
string delete0(string str){
    int i=0;
    while(i<str.size()-1&&str[i]=='0') i++;
    return str.substr(i);
}
string add(string n1,string n2){
    reverse(n1.begin(),n1.end());
    reverse(n2.begin(),n2.end());
    while(n1.size()!=n2.size())
        n1.size()>n2.size()?n2.push_back('0'):n1.push_back('0');
    string ans="";
    int jw=0;
    for(int i=0;i<n1.size();i++){
        int sum=n1[i]+n2[i]-96+jw;
        ans.push_back(sum%10+48);
        jw=sum/10;
    }
    if(jw) ans.push_back(jw+48);
    reverse(ans.begin(),ans.end());
    return ans;
}
int main() {
    string n1,n2;
    cin>>n1>>n2;
    n1=delete0(n1);
    n2=delete0(n2);
    cout<<add(n1,n2);
    return 0;
}
// 1169 大整数减法
#include <bits/stdc++.h>
using namespace std;
string sub(string n1,string n2){
    reverse(n1.begin(),n1.end());
    reverse(n2.begin(),n2.end());
    while(n2.size()<n1.size()) n2.push_back('0');
    string ans;
    int jw=0;
    for(int i=0;i<n1.size();i++){
        int diff=n1[i]-n2[i]-jw;
        if(diff<0){
            diff+=10;
            jw=1;
        }
        else jw=0;
        ans.push_back(diff+48);
    }
    while(ans.back()=='0'&&ans.size()>1) ans.pop_back();
    reverse(ans.begin(),ans.end());
    return ans;
}
int main(){
    string n1,n2;
    cin>>n1>>n2;
    cout<<sub(n1,n2);
    return 0;
}
大整数乘法
1、字符串存储
2、倒序
3、双层循环(每个数字都需要跟另一个数的各个数字进行乘法)
4、每乘一次,对应位置需要累加

for(int i=0;){
    for(int j=0;){
        c[i+j]+=a[i]*b[j]+jw;
        jw=c[i+j]/10;
        c[i+j]%=10;
    }
    c[i+j+1]+=jw;
}

string mul(string n1,string n2){
    vector<int> num(n1.size()+n2.size()+1,0);
    for(int i=n1.size()-1;i>=0;i--){
        for(int j=n2.size()-1;j>=0;j--){
            int m=(n1[i]-48)*(n2[j]-48)+num[i+j];
            num[i+j+1]=m%10;
            num[i+j]=m/10;
        }
    }
    string ans="";
    int i=0;
    while(num[i]==0&&i!=n1.size()+n2.size()-1) i++;
    for(;i<=n1.size()+n2.size()-1;i++) ans.push_back(num[i]+48);
    return ans;
}


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%