大整数四则运算

这是一种套路题,要先记住大体流程,然后反复练习。

1.大整数的表示。

struct bign {
int d[1000]= {0};//大数的低位数放数组的低位,高位数放数组的高位,即顺位存储,方便加,减,乘。 而除比较特别。
int len = 0;
};

太晚了,改天理思路。

#include"stdio.h"
#include"string.h"

struct bign {
    int d[1000]= {0};//大数的低位数放数组的低位,高位数放数组的高位,即顺位存储
    int len = 0;
};

bign change(char str[]) {
    bign a;
    a.len = strlen(str);
    for(int i = 0; i < a.len ; ++i) {
        a.d[i] = str[a.len -1- i]-'0'; //逆着赋值
    }
    return a;
}

//非负 高精度加法
bign add(bign a,bign b) {
    bign c;
    int carry = 0;//表示进位
    for(int i = 0; i < a.len || i < b.len; ++i) {//以较长的为界限
        int t = a.d[i]+b.d[i]+carry;
        c.d[c.len++] = t%10;
        carry = t/10;
    }
    if(carry != 0) //如果最后进位不为0,则直接赋给结果的最高位
        c.d[c.len++] = carry;//最后len++是因为 len>=1
    return c;
}
//非负 高精度减法
bign sub(bign a,bign b) {
    bign c;
    for(int i = 0; i < a.len || i < b.len; ++i) {
        if(a.d[i] < b.d[i]) {
            a.d[i+1]--;
            a.d[i]+=10;
        }
        c.d[c.len++] = a.d[i]-b.d[i];
    }
    //结果最少有一位数,且去掉高位多余的0,例如 88-88 = 0,len=1
    while(c.d[c.len -1] == 0 && c.len > 1) { //len<=1不执行
        c.len--;
    }
    return c;
}
//非负 高精度与低精度的乘法
bign multi(bign a,int b) {
    bign c;
    int carry = 0;//进位
    for(int i = 0; i < a.len ; ++i) {
        int t = a.d[i]*b + carry;
        c.d[c.len++] = t%10;//个位作为该位结果
        carry = t/10;//高位部位作为新的进位
    }
    while(carry != 0) { //进位可能不止一位
        c.d[c.len++] = carry%10;
        carry/=10;
    }
    return c;
}

//非负 高精度与低精度的除法
bign div(bign a,int b,int &r) {
    bign c;
    r = 0;//余数初始为0 
    c.len = a.len; //令商与被除数的初始的位数相等
    for(int i = a.len-1; i>=0; --i) {
        r = r*10+a.d[i]; //关键一步,与上一位余数组合
        c.d[i] = r/b;
        r = r%b;
    }
    while(c.d[c.len-1] == 0 && c.len > 1) {
        c.len--;
    }
    return c;
}

void print(bign a) { //输出bign
    for(int i = a.len-1; i >=0; --i) {
        printf("%d",a.d[i]);
    }
}

int main() {
//    char str1[1000],str2[1000];
//    gets(str1);
//    gets(str2);
//    bign a = change(str1);
//    bign b = change(str2);
//    print(add(a,b));
//    printf("\n");
//    print(sub(a,b));
//    printf("\n");
//    print(multi(a,3));
//    printf("\n");
//    int r;
//    print(div(a,7,r));
//    printf(" %d",r);
    char s[1000];
    int a,r;
    scanf("%s %d",s,&a);
    bign S = change(s);
    print(div(S,a,r));
    printf(" %d",r);
    return 0;
}

 

posted @ 2020-02-13 22:45  tangq123  阅读(289)  评论(0编辑  收藏  举报