您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-12 15:38 337 查看
前言:大一新生,代码风格可能有点奇怪。

题目:

大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。例如:我们要计算如下两个数的乘积时,用我们已知的数据类型是无法精确表示其结果的:
a1 = 11111111111111111111111111111111111b1 = 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);
    }
}
加法也类似于减法。这些仅仅只是对于整数,不含有小数部分的求解。希望能够帮助到入门的新生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: