加法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| string add(string a,string b){ if(a.size() > b.size()) swap(a,b); b.insert(b.begin(),'0'); int t = 0; for(int i = b.size()-1,j = a.size()-1;i>=0;i--,j--){ int cur; if(j>=0) cur = (a[j]-'0') + (b[i]-'0') + t; else cur = (b[i] - '0') +t; b[i] = (cur%10) + '0'; t = cur/10; } int idx = b.find_first_not_of('0'); return idx != -1? b.substr(idx): "0"; }
|
减法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| string sub(string a,string b){ int t = 0; for(int i = a.size()-1,j = b.size()-1;i>=0;i--,j--){ int up = 0,down = 0; up = (a[i]-'0') + t; t = 0; if(j>=0) down = (b[j]-'0'); if(up < down) up+=10,t = -1; int cur = up-down; a[i] = cur+'0'; } int idx = a.find_first_not_of('0'); return idx != -1? a.substr(idx) : "0"; }
|
乘法(高精度乘高精度)
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int r[50000],r_a[50000],r_b[50000];
int main()
{
string a,b;
int len,res=0,cnt=0,k; //cnt进位,res保存每位数相乘结果
cin>>a>>b;
for(int i=1;i<=a.size();i++) r_a[i]=a[i-1]-'0';
for(int i=1;i<=b.size();i++) r_b[i]=b[i-1]-'0';
len=b.size()+a.size()-1; //给长度初始化为两个数位数之和
for(int i=a.size();i>=1;i--){
cnt=0; res=0; k=a.size()-i+1; //k给r数组计数
for(int j=b.size();j>=1;j--){
res=r_a[i]*r_b[j]+cnt+r[k];//每一位数相乘有进位就进位 ,这
//里计算每一位数字乘积的时候 ,
//一定要加上上一次该位置的数
cnt=res/10; //刷新进位
r[k++]=res%10;
if(j==1&&cnt){
r[k++]=cnt;//如果每次最后进位了就要在r数组中向后移动一个位置填上该数
}
if(j==1&&i==1&&cnt) len++;//若最后进位长度要加一
}
}
while(len>1&&r[len]==0) len--;
for(int i=len;i>=1;i--){
cout<<r[i];
}
return 0;
}
乘法(高精度乘低精度)
1 2 3 4 5 6 7 8 9 10 11
| string mul(string a,ll b){ string c = ""; ll t = 0; for(int i = a.size()-1;i>=0 || t;i--){ if(i>=0) t += (a[i]-'0')*b; c += (t%10) +'0'; t/=10; } reverse(c.begin(),c.end()); return c; }
|
大数乘大数(高精度乘高精度)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| int a[10000],b[10000],ans[10000]; string x,y; int len1,len2,pos; void change(string x,string y){ len1=x.size(),len2=y.size(); for(int i=1;i<=len1;i++) a[i]=x[len1-i]-'0'; for(int i=1;i<=len2;i++) b[i]=y[len2-i]-'0'; } int *hpre(int a[],int b[]){ if((len1==1&&a[1]==0)||(len2==1&&b[1]==0)){ ans[++pos]=0; return ans; } int jin=0; for(int i=1;i<=len1;i++){ for(int j=1;j<=len2;j++){ pos=j+i-1; int x=a[i]*b[j]+ans[pos]; jin=x/10; if(jin) ans[pos+1]+=jin; ans[pos]=x%10; } } return ans; } void print(int ans[]){ if(ans[pos+1]!=0) cout<<ans[pos]; for(int i=pos;i>=1;i--){ cout<<ans[i]; } }
|
除法(高精度除低精度)
1 2 3 4 5 6 7 8 9 10 11
| string div(string a,ll b){ string c = ""; ll cur = 0; for(int i = 0;i<a.size();i++){ cur = cur*10 + (a[i]-'0'); c += to_string(cur/b); cur %= b; } int idx = c.find_first_not_of('0'); return idx!=-1 ? c.substr(idx) : "0"; }
|
大数取模
1 2 3 4 5 6 7 8 9 10 11 12
| int mod(char str[],int c) { int number[100]; for(int i=0;i<strlen(str);i++) number[i]=str[i]-'0'; int sum=0; for(int i=0;i<strlen(str);i++) { sum=((long long)sum*10+number[i])%c; } return sum; }
|
比较大小
1 2 3 4 5 6 7
| bool cmp(string a,string b){ int idx1 = a.find_first_not_of('0'),idx2 = b.find_first_not_of('0'); a = idx1!=-1? a.substr(idx1) : "0"; b = idx2!=-1? b.substr(idx2) : "0"; if(a.size() != b.size()) return a.size() >= b.size(); return a>=b; }
|
告诉你个秘密点击下面的赏字就能赞助我了哦(owo)