c++大数乘法和大数减法

前言:大一新生,代码风格可能有点奇怪。

题目:

大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。例如:我们要计算如下两个数的乘积时,用我们已知的数据类型是无法精确表示其结果的:

a1 = 11111111111111111111111111111111111

b1 = 11111111111111111111111111111111111111

求:a1 * b1;

题目很简单求两个数的乘积,显然整形是存不下来的。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define INF 0xfffff;
#define sl(a) strlen(a)
#define ll long long
char da(char *a, char *b)
{
    int i,j,bl,al,c[1000];
    char h[1000];
    al = sl(a);//求出 a,b的长度
    bl = sl(b);
    mem(c,0);//将数组清空
    mem(h,0);
    for (i = 0; i <al; i++)
    {
        for (j = 0; j < bl; j++)
        {
            c[i + j + 1] += (a[i] - '0')*(b[j] - '0');//进行乘积运算 
        }
    }
    for (i = al + bl-1; i >0; i--)//我们从低位开始进位
    {
        if (c[i] >= 10)//上面的运算乘积出来的结果大于10 我们就要进行进位
        {
            c[i-1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    i = 0;
    while (c[i]==0)//前导0的情况
    i++;
    for (j = 0; i < al+ bl; j++, i++)
        h[j] = c[i]+'0';//将整形转换为字符型存下 也可以直接输出
    h[j] = '\0';
    cout<<h<<endl;
}

int main()
{
    int i;
    char A[101];
    char B[101];
    while(scanf("%s%s",A,B)!=EOF)
    {
        if(strcmp(A,"0")==0||strcmp(B,"0")==0)//判断是否为0;
            cout<<0<<endl;
        else da(A,B);
    }
    return 0;
}


下面我们再来看一个大数减法
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define INF 0xfffff;
#define sl(a) strlen(a)
#define ll long long
void cl(char a[],char b[])
{
    int a1,b1,i,j;
    char c[100];
    if(strcmp(a,b)==0) printf("0");//如果两个字符串比较一样 那么就输出0
    else
    {
        for(i=sl(a)-1,j=sl(b)-1; i>=0,j>=0; i--,j--)//我们从最低位开始做减法
        {
            a[i]=a[i]-b[j]+'0';//因为a的长度比b长 所以我们只需要存在a里面
        }

        for(i=strlen(a)-1; i>=0; i--)//开始解决进位
        {
            if(a[i]<'0')
            {
                a[i]=a[i]+10;
                a[i-1]=a[i-1]-1;//因为元素控制在0~9所以负数也不会小于-10,那么我只需要将前一位-1
            }
        }
        for(i=0; a[i]!='\0'; i++)//判断前导0
            if(a[i]!='0') break;
        puts(a+i);
    }
}
main()
{
    int a1,b1,c1;
    char a[100],b[100];
    scanf("%s%s",a,b);
    a1=sl(a);
    b1=sl(b);
    if(a1==b1&&a[0]<b[0])//判断长度,长度一样,但是第一位小 那么就肯定是负数
    {
        printf("-");
        cl(b,a);
    }
    else if(a1>=b1)//这样就是正数
        cl(a,b);
    else
    {
        printf("-");
        cl(b,a);
    }
}



加法也类似于减法。这些仅仅只是对于整数,不含有小数部分的求解。
希望能够帮助到入门的新生。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值