题解 | #大整数相乘#
大整数相乘
https://www.nowcoder.com/practice/0f0badf5f2204a6bb968b0955a82779e
#include <stdio.h>
#include <string.h>
int my_strlen1(char* str) //自制一个可以得出数组成员个数的函数;便于准确得出“12300042310000”类似的数组排列的成员个数
{
int a=0;
for(int i=0;i<1000;i++) //适用于不超过1000个成员的数组
{
if(str[i]!=0)
a++;
if(str[i]==0)
{
int b;
for(b=i;b<1000;b++)
{
if(str[b]!=0)
{
a=a+b-i+1;
i=b;
break;
}
}
if(b==100)
break;
}
}
return a;
}
int main() {
//int a, b;
//while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
//printf("%d\n", a + b);
//}
char a[100],b[100],data[1000]={0};
scanf("%s %s",a,b);
int a0=0; //a0=strlen(a);
for(a0=0;;a0++)
{
if(a[a0]==0)
break;
else if(a[a0]>57 || a[a0]<48)
{
printf("输入错误\n");
return 0;
}
}
//printf("%d\n",a0);
int b0=0;
for(b0=0;;b0++)
{
if(b[b0]==0)
break;
else if(b[b0]>57 || b[b0]<48)
{
printf("输入错误\n");
return 0;
}
}
//printf("%d\n",b0);
if(a0>b0)
{
for(int i=0;i<b0;i++)
{
for(int j=a0;j>0;j--)
{
data[i+(a0-j)]+=((b[b0-1-i]-48)*(a[j-1]-48))%10; //取乘积个位
if(data[i+(a0-j)]>=10) //个位超出10
{
data[i+(a0-j)]-=10;
data[i+(a0-j+1)]+=1;
}
data[i+(a0-j+1)]+=((b[b0-1-i]-48)*(a[j-1]-48))/10; //取乘积十位
if(data[i+(a0-j+1)]>=10) //个位超出10
{
data[i+(a0-j+1)]-=10;
data[i+(a0-j+2)]+=1;
}
}
}
}
else {
for(int i=0;i<a0;i++)
{
for(int j=b0;j>0;j--)
{
data[i+(b0-j)]+=((a[a0-1-i]-48)*(b[j-1]-48))%10; //取乘积个位
if(data[i+(b0-j)]>=10) //个位超出10
{
data[i+(b0-j)]-=10;
data[i+(b0-j+1)]+=1;
}
data[i+(b0-j+1)]+=((a[a0-1-i]-48)*(b[j-1]-48))/10; //取乘积十位
if(data[i+(b0-j+1)]>=10) //个位超出10
{
data[i+(b0-j+1)]-=10;
data[i+(b0-j+2)]+=1;
}
}
}
}
for(int i=my_strlen1(data)-1;i>=0;i--)
printf("%d",data[i]);
printf("\n");
return 0;
}
