面试题之总结-大数运算

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

高位数低位数
A[0]A[1]A[2]A[3]
1234567822345678

 

B[0]B[1]B[2]B[3]
3345145823453453

+ - * /加减乘除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);
    
}

转载于:https://my.oschina.net/lucusguo/blog/505336

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值