面试题之总结-大数运算

解法:既然一个变量无法表示一个超长整数,那么我们使用多个变量好了。当然这使用阵列最为方便,整型数值最大可以存储至65535,为了方便以符合使用十进制的习惯,让每一个阵列元素存储四个位数,也就是0到9999的数,

高位数 低位数
A[0] A[1] A[2] A[3]
1234 5678 2234 5678

 

B[0] B[1] B[2] B[3]
3345 1458 2345 3453

+ - * /加减乘除C[N]用于存放结果

C[0] C[1] C[2] C[3]
???? ???? ???? ????
//超长整数运算研究
#include<iostream>
using namespace std;
#define N 1000

//大数相加,a:被加数,b:加数,c:运算结果
void add(int *a, int *b, int *c)
{
    int i = 0,carry = 0;
    for(i = N-1; i >= 0; i--)
    {
        c[i] = a[i] + b[i] + carry;
        if(c[i] < 10000)
        {
            carry = 0;
        }
        else//进位
        {
            c[i] = c[i] - 10000;
            carry = 1;
        }
    }
}
//大数相减,a:被减数,b:减数,c:运算结果
void sub(int *a, int *b, int *c)
{
    int i, borrow = 0;
    for(i = N-1; i >= 0; i--)
    {
        c[i] = a[i] - b[i] - borrow;
        if(c[i] >= 0)
            borrow = 0;
        else  //借位
        {
            c[i] = c[i] + 10000;
            borrow = 1;
        }
    }
}
//大数相乘,a:被乘数,b:乘数,c:运算结果
//这里的b只是一个正常数,不属于大数,如果是两个大数相乘只能是,先相乘再相加,得到最终结果
void mult(int *a, int b, int *c)
{
    int i,tmp,carry = 0;
    for(int i = N-1; i >= 0; i--)
    {
        tmp = a[i] * b + carry;
        c[i] = tmp % 10000;
        carry = tmp / 10000;
    }
}
//大数相除,a:被除数,b:除数,c:运算结果
//如果是两个大数相除,只能通过减的方式,一直减,直到小于减数为止,得到的数是余数,减的次数,就是商
//比如 121 30  121-4*30=1,1是余数,4是商
void div(int *a, int b, int *c)
{
    int i,tmp,remain = 0;
    for(i = 0; i < N; i++)
    {
        tmp = a[i] + remain;
        c[i] = tmp / b;
        remain = (tmp%b)*10000;
    }
}
void result(int *c)
{
    for(int i = 0; i < 4; i++)
    {
        cout << c[i];
    }
}

int main(void)
{
    int a1[N] = {3345,1458,3423,2345};
    int b1[N] = {1234,5678,2234,5678};
    int c1[N];
    add(a1,b1,c1);
    result(c1);
    sub(a1,b1,c1);
    result(c1);
    
}

你可能感兴趣的:(大数)