大整数的加减乘法,没有除法,你想累死我啊?

#include<stdio.h>
#include<string.h>
#include "iostream"

// declare

struct number{
    bool negative=0;    // positive or negative
    int num[5002]={}; // 10 based number
    int length=0;
};
void add(number* num1, number* num2);
void minus(number* num1, number* num2);
void multiple(number* num1, number* num2);
void divide(number* num1, number* num2);
// implement
void add(number* num1, number* num2){
    // negative handling
    if (num1->negative && !num2->negative){
        num1->negative=0;
        minus(num2,num1);
        return;
    }
    if (num2->negative && ! num1->negative){
        num2->negative=0;
        minus(num1,num2);
        return;
    }
    if (num1->negative && num2->negative){
        num1->negative=0;
        num2->negative=0;
        add(num1,num2);
        num1->negative=1;
        return;
    }
    // positive calculate
    int length=num1->length>=num2->length?num1->length:num2->length;
    for(int i=0;i<length;i++){
        num1->num[i]=num1->num[i]+num2->num[i];
        if (num1->num[i]>9){
            if (i==length-1){
                num1->length++;
            }
            num1->num[i+1]++;
            num1->num[i]-=10;
        };
    }
}
void minus(number* num1, number* num2){
    // negative handling
    if (num2->negative){
        num2->negative=0;
        add(num1,num2);
        return;
    }
    if (num1->negative){
        num1->negative=0;
        add(num1,num2);
        num1->negative=1;
        return;
    }
    // positive calculate
    int length=num1->length>=num2->length?num1->length:num2->length;
    for (int i=length-1; i>-1;i--){
        num1->num[i]=num1->num[i]-num2->num[i];
        if (num1->num[i]<0){
            if (i==length-1){
                num1->negative=1;
                num1->num[i]=0-num1->num[i];
            }
            else{
                num1->num[i+1]-=1;
                num1->num[i]+=10;
            }
        }
    }
    // calculate length
    for (int i=num1->length-1; i>=0;i--) {
        if (num1->num[i] == 0 && i == num1->length - 1) {
            num1->length--;
        }
    }

}
void multiple(number* num1, number* num2){
    num1->negative=num1->negative^num2->negative;
    int tmp[5002]={};
    int length1=num1->length;
    int length2=num2->length;
    int k=0;
    int tmpLength=0;
    for(int i=0;i<length2;i++){// mutiple
        for (int j=0;j<length1;j++){ // multipled
            tmp[j+i]=num2->num[i]*num1->num[j];
            k=0;
            while (tmp[j+i+k]>9){
                tmp[j+i+k+1]+=tmp[j+i+k]/10;
                tmp[j+i+k]%=10;
                k++;
            }
            tmpLength=tmpLength<j+i+k+1?j+i+k+1:tmpLength;
        }
    }
    // clone tmp 2 num1
    num1->length=tmpLength;
    for (int i=0;i<tmpLength;i++){
        num1->num[i]=tmp[i];
    }
}
void divide(number* num1, number* num2){
    std::cout<<"It is too complicated, do you want me die?"<<std::endl;
}


int main(){
    char num1[5002]={},num2[5002]={},oper[1]={},result[5002]={};
    number first,second;
    scanf("%s%s%s",num1,num2,&oper);
    // convert input 2 formated number
    first.negative=(num1[0]=='-');
    first.length=strlen(num1)-(int)(num1[0]=='-');
    for(int i=0;i<strlen(num1)-(num1[0]=='-');i++){
        first.num[i]=num1[strlen(num1)-i-1]-'0';
    }
    second.negative=(num2[0]=='-');
    for(int i=0;i<strlen(num2)-(num2[0]=='-');i++){
        second.num[i]=num2[strlen(num2)-i-1]-'0';
    }
    second.length=strlen(num2)-(int)(num2[0]=='-');
    switch (oper[0]){
        case '+':
            add(&first,&second);
            break;
        case '-':
            minus(&first,&second);
            break;
        case '*':
            multiple(&first,&second);
            break;
        case '/':
            divide(&first,&second);
            break;
        default:
            break;
    };
    // Post process the result
    if (first.negative){
        result[0]='-';
    }
    for (int i=0;i<(first.length?first.length:1);i++){
        result[first.length+first.negative-i-1]=+first.num[i]+'0';
    }
    std::cout<<result<<std::endl;
    std::cin.get();
    std::cin.get();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值