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

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

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值