大数乘法、加法、减法、除法

乘法

(1)转换并反转,字符串转换为数字并将字序反转;

(2)逐位相乘,结果存放在result_num[i+j]中;

(3)处理进位,消除多余的0;

(4)转换并反转,将计算结果转换为字符串并反转。

除法

就是一直减,如果被除数远远大于除数,那么运行时间特别长。应该有更好的方法。

加法、减法

减法思路类似加法,加法思路就是考虑进位的影响。

代码

#include<iostream>
using namespace std;
#include<algorithm>
#define MAXN 50

char *big_multi(const char data11[], const char data22[])
{

    int len1 = strlen(data11);
    int len2 = strlen(data22);
    char *data1 = new char[len1 + 1];
    char *data2 = new char[len2 + 1];
    memcpy(data1, data11,len1);
    memcpy(data2, data22, len2);
    for (int i = 0; i < len1 / 2; i++)
        swap(data1[i], data1[len1 - i - 1]);
    for (int i = 0; i < len2 / 2; i++)
        swap(data2[i], data2[len2 - i - 1]);


    int len = len1 + len2;
    int *res = new int[len];
    memset(res, 0, sizeof(int)*len);
    for (int i = 0; i < len1; i++)
        for (int j = 0; j < len2; j++)
            res[i + j] = res[i + j] + (data1[i] - '0')*(data2[j] - '0');//存储data1的第i位和data2的第j位相乘的结果,存储在第i+j位上
    int c = 0,k=0;
    for (int i = 0; i <= len - 1; i++)//进位处理
    {
        res[i] = res[i] + k;
        k = res[i] / 10;
        res[i] = res[i] % 10;
    }

    int new_len=0;//实际的长度
    for (new_len = len - 1; new_len >= 0; new_len--)
        if (res[new_len] != 0)
            break;
    char *new_res = new char[new_len+1];
    new_res[new_len + 1] = '\0';
    for (int i = new_len; i >= 0; i--)
        new_res[new_len - i] = res[i] + '0';
    return new_res;
}

char *bigadd(const char *data1, const char*data2)//不考虑正加负以及负加正
{
    int len1 = strlen(data1), len2 = strlen(data2);
    int i = len1 - 1, j = len2 - 1;
    int len = (max(len1, len2) + 1);
    char *res = new char[len];
    memset(res, '0', sizeof(char)*len);
    int k = 0,temp=0;
    while (i >= 0 && j >= 0)
    {
        temp= (data1[i] - '0') + (data2[j] - '0') +temp;
        res[k] = temp % 10+'0';
        temp = temp / 10;
        k++;
        i--;
        j--;
    }
    while (i >= 0)
    {
        temp = (data1[i] - '0') + temp;
        res[k] = temp % 10 + '0';
        temp = temp / 10;
        k++;
        i--;
    }
    while (j >= 0)
    {
        temp = (data2[j] - '0') + temp;
        res[k] = temp % 10 + '0';
        temp = temp / 10;
        k++;
        j--;
    }
    if (temp > 0) res[k++] = temp % 10 + '0';
    res[k] = '\0';
    len1 = strlen(res);
    for (int i = 0; i < len1 / 2; i++)
        swap(res[i], res[len1 - i - 1]);
    return res;
}

char *bigminus_direct(const char *data11, const char*data22)
{
    int len1 = strlen(data11);
    int len2 = strlen(data22);
    char *data1 = new char[len1 + 1];
    char *data2 = new char[len2 + 1];
    memcpy(data1, data11, len1 + 1);
    memcpy(data2, data22, len2 + 1);

    //下面处理两个正数相减
    bool flag = 0;//表示正
    if (len1 < len2)//交换
    {
        flag = 1;
        swap(data2, data1);
    }
    else if (len2 == len1)
    {
        if (strcmp(data1, data2) < 0)
        {
            flag = 1;
            swap(data2, data1);
        }
        if (strcmp(data1, data2) == 0)
        {
            char *res = new char[2];
            res[1] = '\0';
            res[0] = '0';
            return res;
        }
    }
    int i = strlen(data1) - 1, j = strlen(data2) - 1;
    int carry = 0;
    char *res = new char[strlen(data1) + 2];
    res[strlen(data1) + 1] = '\0';
    memset(res, '0', sizeof(char)*(strlen(data1)));
    int k = strlen(data1);
    while (i >= 0 && j >= 0)
    {
        int tmp = data1[i--] - data2[j--] - carry;
        if (tmp < 0)
        {
            tmp += 10;
            carry = 1;
        }
        else
            carry = 0;
        res[k--] = tmp + '0';
    }
    while (i >= 0)
    {
        int tmp = data1[i--] - '0' - carry;
        if (tmp < 0)
        {
            tmp += 10;
            carry = 1;
        }
        else
            carry = 0;
        res[k--] = tmp + '0';
    }
    i = 0;
    while (res[i] == '0') i++;
    if (flag)
    {
        res[i - 1] = '-';
        i--;
    }

    char *res_new = new char[strlen(data1) + 2 - i];
    for (int k = 0; k<strlen(data1) + 2 - i; k++)
        res_new[k] = res[i + k];
    return res_new;
}

char *bigminus(const char *data11, const char*data22)
{

    //-a-b:负减去正,等于两个正数相加取负,以及正-负
    //a-b与-b+a  正-正,负-负
    //先不考虑其中一个为空的
    int len1 = strlen(data11), len2 = strlen(data22);
    if (data11[0] != '-'&&data22[0] != '-')
        return bigminus_direct(data11, data22);
    else if (data11[0] != '-'&&data22[0] == '-')
    {
        char *data23 = new char[len2];
        for (int i = 0; i < len2 - 1; i++)
            data23[i] = data22[i + 1];
        data23[len2 - 1] = '\0';
        return bigadd(data11, data23);
    }
    else if (data11[0] == '-'&&data22[0] != '-')
    {
        char *data23 = new char[len1];
        for (int i = 0; i < len1 - 1; i++)
            data23[i] = data11[i + 1];
        data23[len1 - 1] = '\0';
        char *res=bigadd(data23, data22);
        int new_len=strlen(res);
        char *new_res=new char[new_len+2];
        new_res[new_len+1]='\0';
        new_res[0]='-';
        for(int i=0;i<new_len;i++)
            new_res[i+1]=res[i];
        return new_res;
    }
    else//都是负的,等效于第二个减去第一个
    {
        char *data23 = new char[len2];
        for (int i = 0; i < len2 - 1; i++)
            data23[i] = data22[i + 1];
        data23[len2 - 1] = '\0';
        char *data13 = new char[len1];
        for (int i = 0; i < len1 - 1; i++)
            data13[i] = data11[i + 1];
        data13[len1 - 1] = '\0';
        return bigminus_direct(data23,data13);  
    }
}

char* bigDivision(const char *data11, const char*data22)//只考虑两个正的
{
    int len1 = strlen(data11), len2 = strlen(data22);
    if(len1<len2)
    {
        char *res=new char[2];
        res[0]='0';
        res[1]='\0';
        return res;
    }
    char *res=new char[len1-len2+1];
    memset(res,'0',sizeof(char)*(len1-len2+2));
    res[len1-len2+1]='\0';
    char *tmp= bigminus(data11,data22);

    while(tmp[0]!='-')
    {
        char *rete=new char[2];
        rete[0]='1';
        rete[1]='\0';
        res=bigadd(rete,res);
        delete [] rete;
        tmp=bigminus(tmp,data22);
    }
    int i = 0;
    while (res[i] == '0') i ++ ;
    char *new_res = new char[strlen(res) - i + 1];
    for (int j = 0; j < strlen(res) - i ; j++)
        new_res[j] = res[i + j];
    new_res[strlen(res) - i] = '\0';
    return new_res;
}

int main()
{
    char data1[MAXN], data2[MAXN];

    while (cin >> data1 >> data2)
    {
        cout << bigDivision(data1, data2) << endl;
        /*cout << bigminus(data1, data2) << endl;

        cout << big_multi(data1, data2) << endl;
        cout << bigadd(data1, data2) << endl;*/
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值