大数加减乘模板(十进制)

来源:互联网 发布:欧洲历史书籍推荐知乎 编辑:程序博客网 时间:2024/05/22 11:56

这个模板可以处理大数基本上所有的情况,正负数,零,加减乘都是可以的

#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e6+10;char str1[maxn],str2[maxn],ans[maxn];string s1,s2;bool flag1,flag2;char check;void Add(char *a,char *b,char *res){    int lena = strlen(a);    int lenb = strlen(b);    int i=lena-1,j=lenb-1,k=0;    while((i+1)||(j+1))    {        if(i!=-1)res[k]+=(int)(a[i--]-'0');        if(j!=-1)res[k]+=(int)(b[j--]-'0');        res[k+1]+=res[k]/10;        res[k++]%=10;    }    while(!res[k]&&k>1)k--;    if(res[k])k++;    res[k]=0;    for(int s=k-1; s>=0; s--)        res[s]+='0';    for(int s=0; s<=(k-1)/2; s++)        swap(res[s],res[k-1-s]);}void Sub(char *a,char *b,char *res){    int lena = strlen(a);    int lenb = strlen(b);    int ans[maxn];    memset(ans,0,sizeof(ans));    int i=lena-1,j=lenb-1,k=0;    while((i+1)||(j+1))    {        if(j!=-1)ans[k]+=a[i--]-b[j--];        else ans[k]+=a[i--]-'0';        if(ans[k]<0)        {            ans[k+1]-=1;            ans[k]+=10;        }        k++;    }    while(ans[k]==0&&k>=1)k--;    for(int s=k; s>=0; s--)        res[s]=ans[s]+'0';    for(int s=0; s<=k/2; s++)        swap(res[s],res[k-s]);    res[k+1]=0;}void Mul(char *a,char *b,char *res){    int lena = strlen(a);    int lenb = strlen(b);    int k=0;    for(int i=0;i<lena; i++)        for(int j=0; j<lenb; j++)        {            res[i+j]+=(int)((a[lena-1-i]-'0')*(b[lenb-1-j]-'0'));            if(res[i+j]>7)            {                res[i+j+1]+=res[i+j]/10;                res[i+j]%=10;                if(i+j+1>k)k=i+j+1;            }            else if(res[i+j]&&i+j>k)k=i+j;        }    for(int s=k; s>=0; s--)        res[s]+='0';    for(int s=0;s<=k/2;s++)        swap(res[s],res[k-s]);}void init(){    memset(ans,'\0',sizeof(ans));    flag1 = flag2 = false;    if(s1[0] != '-') for(int i = 0;i < s1.size();i++) str1[i] = s1[i];    else {flag1 = true;for(int i = 1;i < s1.size();i++) str1[i-1] = s1[i];}    if(s2[0] != '-') {for(int i = 0;i < s2.size();i++) str2[i] = s2[i];}    else {flag2 = true;for(int i = 1;i < s2.size();i++) str2[i-1] = s2[i];}}void judge(){    int l1 = strlen(str1),l2 = strlen(str2);    if(l1 < l2) check = '2';    else if(l1 > l2) check = '1';    else{        for(int i = 0;i <= strlen(str1);i++){            if(str1[i] > str2[i]) {check = '1';return ;}            if(str1[i] < str2[i]) {check = '2';return ;}        }        check = '=';return ;    }}void print(){    for(int i = 0;i < strlen(ans);i++)        printf("%c",ans[i]);    puts("");}void ADD(){    if(flag1&&flag2) {Add(str1,str2,ans);printf("-");print();}//同负    else if(!flag1&&flag2){//1正2负        if(check == '1'){Sub(str1,str2,ans);print();}        else if(check == '2') {Sub(str2,str1,ans);printf("-");print();}        else puts("0");    }    else if(flag1&&!flag2){//1负2正        if(check == '1'){Sub(str1,str2,ans);printf("-");print();}        else if(check == '2') {Sub(str2,str1,ans);print();}        else puts("0");    }    else {Add(str1,str2,ans);print();}//同正}void SUB(){    if(flag1&&flag2){//同负        if(check == '2'){Sub(str2,str1,ans);print();}        else if(check == '1') {Sub(str1,str2,ans);printf("-");print();}        else puts("0");    }    else if(!flag1&&flag2){Add(str1,str2,ans);print();}//1正2负    else if(flag1&&!flag2){Add(str1,str2,ans);printf("-");print();}//1负2正    else {//同正        if(check == '1'){Sub(str1,str2,ans);print();}        else if(check == '2') {Sub(str1,str2,ans);printf("-");print();}        else puts("0");    }}void MUL(){    if(str1[0] == '0'||str2[0] == '0') puts("0");    else if(flag1&&flag2){Mul(str1,str2,ans);print();}//同负    else if(!flag1&&flag2){Mul(str1,str2,ans);printf("-");print();}//1正2负    else if(flag1&&!flag2){Mul(str1,str2,ans);printf("-");print();}//1负2正    else{Mul(str1,str2,ans);print();}//同正}int main(){    freopen("2.in","r",stdin);    freopen("2(1).out","w",stdout);    while(cin>>s1>>s2){        init();        judge();        //ADD();        //SUB();        MUL();    }    return 0;}