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

来源:互联网 发布:湖北招生考试软件 编辑:程序博客网 时间:2024/05/20 23:56
#include<stdio.h>#include<string.h>#include "iostream"// declarestruct 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);// implementvoid 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();}
原创粉丝点击