前言:大一新生,代码风格可能有点奇怪。
题目:
大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。例如:我们要计算如下两个数的乘积时,用我们已知的数据类型是无法精确表示其结果的:
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);
}
}
加法也类似于减法。这些仅仅只是对于整数,不含有小数部分的求解。
希望能够帮助到入门的新生。