高精度特别策划 加减乘除余~~~

P1932 A+B & A-B & A*B & A/B Problem

 

题目背景

这个题目很新颖吧!!!

题目描述

求A、B的和差积商余!

输入输出格式

输入格式:

 

两个数两行

A B

 

输出格式:

 

五个数

和 差 积 商 余

 

输入输出样例

输入样例#1:
1
1
输出样例#1:
2
0
1
1
0

说明

length(A),length(B)<=10^4

每个点3s。

 

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>

using namespace std;

typedef int hp[20002];
hp a,b,c,d;
int l1,l2,l3,i,code;
string n1,n2;
void init(hp a) {
    string s;
    int i;
    memset(a,0,sizeof(int)*20002);
    cin >> s;
    a[0] = s.length();
    for(i=1;i<=a[0];i++) {
        a[i]=s[a[0]-i]-48;
    } 
}

void print(hp a) {
    int i;
    for(int i=a[0]; i>=1; i--) cout << a[i];
    cout << endl;
}

void clear(hp a) {
    int i;
    for(int i=1;i<=a[0];i++) {
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    while((a[a[0]]==0) && (a[0]>1)) a[0]--;
}

int compare(hp a, hp b) {
    int i;
    clear(a);
    clear(b);
    if(a[0]>b[0]) {
        return 1;
    }
    if(a[0]<b[0]) {
        return -1;
    }
    for(i=a[0]; i>=1; i--) {
        if(a[i]>b[i]) {
            return 1;
        }
        if(a[i]<b[i]) {
            return -1;
        }
    }
    return 0;
}

void plus1(hp a, hp b, hp c) {
    int i;
    memcpy(c,a,sizeof(int)*20002);
    if(b[0]>c[0]) c[0]=b[0];
    for(int i=1;i<=b[0];i++) {
        c[i]+=b[i];
    }
    c[0]++;
    clear(c);
}

void minus1(hp a, hp b, hp c) {
    int i;
    hp t;
    bool flag = false;
    if(compare(a,b)<0) {
        memcpy(c,b,sizeof(int)*20002);
        memcpy(t,b,sizeof(int)*20002);
        memcpy(b,a,sizeof(int)*20002);
        flag = true;
    } else memcpy(c,a,sizeof(int)*20002);
    for(i=1;i<=c[0];i++) {
        c[i+1]--;
        c[i]+=10-b[i];
    }
    clear(c);
    if(flag) memcpy(b,t,sizeof(int)*20002);
}

void multiply(hp a, hp b, hp c) {
    int i,j;
    memset(c, 0, sizeof(int)*20002);
    for(i=1; i<=a[0];i++) 
        for(j=1;j<=b[0];j++)
            c[i+j-1]+=a[i]*b[j];
    c[0]=a[0]+b[0];
    clear(c);
}

void divide(hp a, hp b, hp c, hp d) {
    int i,j,p;
    memset(c, 0, sizeof(int)*20002);
    memset(d, 0, sizeof(int)*20002);
    c[0]=a[0]; d[0]=1;
    for(j=a[0]; j>=1;j--) {
        d[0]++;
        for(p=d[0];p>=2;p--) {
            d[p]=d[p-1];
        }
        d[1]=a[j];
        while(compare(d,b)>=0) {
            c[j]++;
            minus1(d,b,d);
        }
    }
    clear(c);
    clear(d);
}

int main() {
    init(a);
    init(b);
    plus1(a,b,c);
    print(c);
    minus1(a,b,c);
    print(c);
    multiply(a,b,c);
    print(c);
    divide(a,b,c,d);
    print(c);
    print(d);
}

  

posted @ 2016-09-10 22:05  Radiumlrb  阅读(190)  评论(0编辑  收藏  举报