加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 03:16:27 所属栏目:大数据 来源:网络整理
导读:乘法 (1)转换并反转,字符串转换为数字并将字序反转; (2)逐位相乘,结果存放在result_num[i+j]中; (3)处理进位,消除多余的0; (4)转换并反转,将计算结果转换为字符串并反转。 除法 就是一直减,如果被除数远远大于除数,那么运行时间特别长。应

乘法

(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] = '';
    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] = '';
    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,len1 + 1);
    memcpy(data2,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] = '';
            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] = '';
    memset(res,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] = '';
        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] = '';
        char *res=bigadd(data23,data22);
        int new_len=strlen(res);
        char *new_res=new char[new_len+2];
        new_res[new_len+1]='';
        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] = '';
        char *data13 = new char[len1];
        for (int i = 0; i < len1 - 1; i++)
            data13[i] = data11[i + 1];
        data13[len1 - 1] = '';
        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]='';
        return res;
    }
    char *res=new char[len1-len2+1];
    memset(res,sizeof(char)*(len1-len2+2));
    res[len1-len2+1]='';
    char *tmp= bigminus(data11,data22);

    while(tmp[0]!='-')
    {
        char *rete=new char[2];
        rete[0]='1';
        rete[1]='';
        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] = '';
    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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读