九度oj 1037 Powerful Calculator 高精度算法

来源:互联网 发布:vscode 运行nodejs 编辑:程序博客网 时间:2024/05/29 17:26

http://ac.jobdu.com/problem.php?pid=1037

高精度运算加,减,乘。并且带有符号。

//高精度算法,400位以内的加,减,乘。#include <stdio.h>#include <string.h>//add funcvoid add(int *a, int lena, int *b, int lenb, int *t, int &lent){    int i, j, k = 0;    for(i = 0, j = 0; i < lena && j < lenb; i ++, j ++){        t[k ++] = a[i] + b[j];    }    while(i < lena){        t[k ++] = a[i ++];    }    while(j < lenb){        t[k ++] = b[j ++];    }    j = 0;    for(i = 0; i < k; i ++){        t[i] += j;        j = t[i]/10;        t[i] %= 10;    }    while(j != 0){        t[k ++] = j % 10;        j /= 10;    }    lent = k;}//sub funcvoid sub(int *a, int lena, int *b, int lenb, int *t, int &lent){    int i, j = 0, k = 0;    for(i = 0; i < lenb; i ++){        t[i] = a[i] - b[i];    }    k = i;    while(i < lena){        t[k ++] = a[i ++];    }    for(i = 0; i < k; i ++){        t[i] += j;        if(t[i] < 0){            j = -1;            t[i] += 10;        }        else {            j = 0;        }    }    while(t[k - 1] == 0){        k --;    }    lent = k;}//numti funcvoid multi(int *a, int lena, int *b, int lenb, int *t, int &lent){    int i, j, k = 0;    for(i = 0; i < lena; i ++){        for(j = 0; j < lenb; j ++){            t[i + j] += a[i] * b[j];        }    }    k = i + j - 1;/*    for(i = 0; i < k; i ++){        printf("%d ", t[i]);    }    printf("\n");*/    j = 0;    for(i = 0; i < k; i ++){        t[i] += j;        j = t[i] / 10;        t[i] %= 10;    }    while(j != 0){        t[k ++] = j % 10;        j /= 10;    }    lent = k;}//chang char * to int * and return the lenth and signalvoid getnum(char *str, int *a, int &lena, char &op){    int len = strlen(str);    int i, t = 0;    if(str[0] == '-')op = '-';    else op = '+';    for(i = len - 1; i >= 1; i --){        a[t ++] = (int)(str[i] - '0');    }    if(str[0] != '-' && str[0] != '+')a[t ++] = (int)(str[0] - '0');    lena = t;}int main(){//    freopen("input.in", "r", stdin);    char str[450], str2[450], op, op2;    int num[450], num2[450];    int ares[450], sres[450], mres[900];    int lennum, lennum2, lena, lens, lenm;    int i;    while(gets(str)){        gets(str2);        lennum = strlen(str);        lennum2 = strlen(str2);        getnum(str, num, lennum, op);        getnum(str2, num2, lennum2, op2);        /*        add(num, lennum, num2, lennum2, ares, lena);        printf("%d\n", lena);        for(i = lena - 1; i >= 0; i --){            printf("%d", ares[i]);        }        printf("\n");        if(lennum > lennum2){            sub(num, lennum, num2, lennum2, sres, lens);            printf("%d\n", lens);            for(i = lens - 1; i >= 0; i --){                printf("%d", sres[i]);            }            printf("\n");        }*/        if(op == op2){            //add            add(num, lennum, num2, lennum2, ares, lena);            if(op == '-')printf("-");            for(i = lena - 1; i >= 0; i --){                printf("%d", ares[i]);            }            printf("\n");            //sub            if(lennum > lennum2){                sub(num, lennum, num2, lennum2, sres, lens);                if(op == '-')printf("-");                for(i = lens - 1; i >= 0; i --){                    printf("%d", sres[i]);                }                printf("\n");            }//if            else if(lennum < lennum2){                sub(num2, lennum2, num, lennum, sres, lens);                if(op == '+')printf("-");                for(i = lens - 1; i >= 0; i --){                    printf("%d", sres[i]);                }                printf("\n");            }//else if            else{                for(i = lennum - 1; i >= 0; i --){                    if(num[i] != num2[i])break;                }                if(i < 0)printf("0\n");                else if(num[i] > num2[i]){                    sub(num, lennum, num2, lennum2, sres, lens);                    if(op == '-')printf("-");                    for(i = lens - 1; i >= 0; i --){                        printf("%d", sres[i]);                    }                    printf("\n");                }                else{                    sub(num2, lennum2, num, lennum, sres, lens);                    if(op == '+')printf("-");                    for(i = lens - 1; i >= 0; i --){                        printf("%d", sres[i]);                    }                    printf("\n");                }//else            }//else        }//if        else{            //add            if(lennum > lennum2){                sub(num, lennum, num2, lennum2, ares, lena);                if(op == '-')printf("-");                for(i = lena - 1; i >= 0; i --){                    printf("%d", ares[i]);                }                printf("\n");            }//if            else if(lennum < lennum2){                sub(num2, lennum2, num, lennum, ares, lena);                if(op == '+')printf("-");                for(i = lena - 1; i >= 0; i --){                    printf("%d", ares[i]);                }                printf("\n");            }//else if            else{                for(i = lennum - 1; i >= 0; i --){                    if(num[i] != num2[i])break;                }                if(i < 0)printf("0\n");                else if(num[i] > num2[i]){                    sub(num, lennum, num2, lennum2, ares, lena);                    if(op == '-')printf("-");                    for(i = lena - 1; i >= 0; i --){                        printf("%d", ares[i]);                    }                    printf("\n");                }                else{                    sub(num2, lennum2, num, lennum, ares, lena);                    if(op == '+')printf("-");                    for(i = lena - 1; i >= 0; i --){                        printf("%d", ares[i]);                    }                    printf("\n");                }//else            }//else            //sub            add(num, lennum, num2, lennum2, sres, lens);            if(op == '-')printf("-");            for(i = lens - 1; i >= 0; i --){                printf("%d", sres[i]);            }            printf("\n");        }        memset(mres, 0, sizeof(mres));        multi(num, lennum, num2, lennum2, mres, lenm);        if(op != op2)printf("-");        for(i = lenm - 1; i >= 0; i --){            printf("%d", mres[i]);        }        printf("\n");    }    return 0;}


原创粉丝点击