大数高精度+-*

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct node{
    int len;
    int num[60000];
    node(){len = 0; memset(num,0,sizeof num);}
    node friend operator + (node a,node b){
        node c;
        c.len = 0;
        int p1, p2; p1 = p2 = 1;
        while(p1 <= a.len && p2 <= b.len){
            c.num[++c.len] += a.num[p1++] + b.num[p2++];
            if(c.num[c.len] >= 10) c.num[c.len+1]++, c.num[c.len] %= 10;
        }
        while(p1 <= a.len) {
            c.num[++c.len] += a.num[p1++];
            if(c.num[c.len] >= 10) c.num[c.len+1]++, c.num[c.len] %= 10;
        }
        while(p2 <= b.len) {
            c.num[++c.len] += b.num[p2++];
            if(c.num[c.len] >= 10) c.num[c.len+1]++, c.num[c.len] %= 10;
        }
        if(c.num[c.len+1] != 0) c.len++;
        return c;
    }
    node friend operator - (node a,node b){
        //a>b
        for(int i=1;i<=b.len;i++){
            if(a.num[i] >= b.num[i]){
                a.num[i] -= b.num[i];
            }else{
                b.num[i] -= a.num[i];
                a.num[i] = 0;
                for(int j=i+1;j<=a.len;j++){
                    if(a.num[j] != 0){
                        a.num[j]--;
                        if(a.num[j] == 0 && j == a.len) a.len--;
                        for(int k=i;k<j;k++) a.num[k] = 9;
                        a.num[i] = 10 - b.num[i];
                        break;
                    }
                }
            }
        }
        return a;
    }
    node friend operator * (node a,node b){
        node c;
        c.len = 1;
        for(int i=1;i<=a.len;i++){
            for(int j=1;j<=b.len;j++){
                int pos = i+j-1;
                c.num[pos] += a.num[i]*b.num[j];
                if(c.num[pos] >= 10){
                    int add = c.num[pos]/10;
                    c.num[pos] %= 10;
                    c.num[pos+1] += add;
                    pos++;
                }
                c.len = max(c.len, pos);
            }
        }
        for(int i=c.len;i>=1;i--) {
            if(c.num[i] != 0) break;
            c.len = i;
        }
        return c;
    }
    void print(){
        for(int i=len;i>=1;i--){
            printf("%d",num[i]);
        }
        printf("\n");
    }
    void get(char s[]){
        int l = strlen(s);
        len = l;
        for(int i=1;i<=l;i++){
            num[i] = s[l-i]-'0';
        }
    }
    void get2(int n){
        len = 0;
        while(n){
            num[++len] = n%10;
            n /= 10;
        }
    }
}a,b,c;
int ans[100000];
int main()
{
    //    c = a + b;
    //    c = a - b;
    //    c = a * b;
    c.print();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/w326159487/article/details/79849570