【问题描述】
输出两个不超过100位的大整数的乘积。
要求用本章的块链串知识实现两个大整数的相乘。比如每一个结点存储5位,12345678983426801则需要4个结点;先实现大整数乘上一个一位数;再实现两个大数相加。
用这样的链式存储形式便于计算:12--->34567--->89834--->26801
或者:26801--->89834--->34567--->12
【输入形式】
两个大数
【输出形式】
相乘的结果
【样例输入】
1234567891011121314151617181920
2019181716151413121110987654321
【样例输出】
2492816912877266687794240983772975935013386905490061131076320
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
struct Node
{
char op[5];
Node *next;
};
struct Str
{
char str[100];
};
void Init(Node *&T,char str[])
{
T=(Node*)malloc(sizeof(Node));
T->next=NULL;
}
void Create(Node *T,char str[],int &t)
{
int len=strlen(str),i,k,j,temp;
t=len/5+1;
k=len-1;
for(i=0;i<t;i++)
{
Node *p=(Node*)malloc(sizeof(Node));
p->next=T->next;
T->next=p;
for(j=4;j>=0;j--)
{
p->op[j]=str[k];
if(k==0)
{
temp=j-1;
while(temp>=0)
{
p->op[temp]='0';
temp--;
}
goto end;
}
if(k>=1)
k--;
}
}
end:;
}
void Show(Node *T)
{
Node *p=T->next;
while(p)
{
cout<<p->op;
p=p->next;
}
cout<<endl;
}
void fun(Node *T1,char str2[],int t1,Str bb[],int &kk)
{
Node *q;
//Str bb[500];
int len=strlen(str2),i,k,a,t,wp;
int b[100];
char mp[10];
for(k=len-1;k>=0;k--)
{
q=T1->next;
for(i=0;i<t1;i++)
{
wp=0;
a=10000*(int(q->op[0])-48)+1000*(int(q->op[1])-48)+100*(int(q->op[2])-48)+10*(int(q->op[3])-48)+(int(q->op[4])-48);
b[i]=a*(int(str2[k])-48);
t=5*(t1-1-i);
//接下来计算整型数b[i]的长度
int m=0,temp=b[i];
if(temp>0)
m++;
while(temp/10>0)
{
m++;
temp=temp/10;
}
//接下来进行添加字符'0'的操作便于计算
for(int ww=0;ww<t;ww++)
{
bb[kk].str[ww]='0';
}
temp=b[i];
int qu;
for(int jj=0;jj<m;jj++)
{
qu=temp%10;
temp=temp/10;
mp[jj]=qu+48;
//cout<<"mp[jj]为:"<<mp[jj]<<' ';
}
for(int ww=t;ww<t+m;ww++)
{
bb[kk].str[ww]=mp[wp];
//cout<<"bits[ww]为:"<<bits[ww]<<' ';
wp++;
}
q=q->next;
kk++;
}
}
}
void Reverse(Str bb[],Str rev[],int kk,int &ss,int &max,int t1)//kk=217
{
int i,len,j,tt=0,f=0;
max=strlen(bb[1].str);
for(i=0;i<kk;i++)
{
len=strlen(bb[i].str);
if(len>max)
max=len;
for(j=0;j<len;j++)
{
rev[ss].str[j]=bb[ss].str[len-j-1];
}
ss++;
}
for(i=0;i<kk;i++)
{
tt++;
len=strlen(rev[i].str);
for(j=0;j<f;j++)
{
rev[i].str[len+j]='0';
}
if(tt%t1==0)
f++;
}
}
void Con(Str rev[],int &max,int ss)//ss=217
{
int len,i,j,tt=0;
max=2*max+5;
for(i=0;i<ss;i++)
{
tt=0;
len=strlen(rev[i].str);
for(j=max-len;j<=max-1;j++)
{
rev[i].str[max-tt-1]=rev[i].str[len-tt-1];
tt++;
}
for(j=0;j<=max-len-1;j++)
{
rev[i].str[j]='0';
}
}
}
void Count(Str rev[],int ss,int max)
{
int i=0,jilu=0;
char temp1[max],sum[max];
memset(sum,'0',sizeof(sum));
for(i=0;i<ss;i++)
{
strcpy(temp1,rev[i].str);
for(int m=max-1;m>=0;m--)
{
sum[m]=temp1[m]+sum[m]-48;
if(sum[m]>'9')
{
sum[m-1]++;
sum[m]-=10;
}
}
}
for(i=0;i<max;i++)
{
if(sum[i]!='0')
{
jilu=i;
break;
}
}
for(i=jilu;i<max;i++)
cout<<sum[i];
}
int main()
{
int t1,kk=0,ss=0,max=0;
Str bb[500];
Str rev[500];//用来储存倒转后的字符串
Node *T1=NULL;
char str1[200];
char str2[200];
cin>>str1;
cin>>str2;
Init(T1,str1);
Create(T1,str1,t1);
fun(T1,str2,t1,bb,kk);//此函数用来计算两个相乘的结果
Reverse(bb,rev,kk,ss,max,t1);//此函数用来将bb中的字符串倒转
Con(rev,max,ss);//此函数将字符串补成相同长度便于相加
Count(rev,ss,max);//计算结果函数
}