//程序作用:以字符串形式输入两个任意长度的整数,计算出这两个数的积(实验4.1)
//采用技术:数组,链表
//完成时间:2006.3.27
//作者:张亚南
#include <malloc.h>
#include <stdio.h>
#include <iostream.h>
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode;
void main()
{
Lnode *q,*p,*L0,*L1,*p_pre;
int n0=0,n1=0,i,j,n3;
int *a,*b,*c;
char m;
int temp0=0,temp1=0,temp2=0;
//读入数据
L0=(Lnode *)malloc(sizeof(Lnode));
L1=(Lnode *)malloc(sizeof(Lnode));
L0->next=NULL;
L1->next=NULL;
p=L0;
for(i=1;i<=2;i++)
{
if (i==1)
{
cout<<"请输入第一个数据(如果输入非数字字符将跳过):"<<endl;
printf("Number1=");
}
else
{
cout<<"请输入第二个数据(如果输入非数字字符将跳过):"<<endl;
printf("Number2=");
}
flushall();//清楚缓存中的其他字符
while((m=getchar())!=10)
{
if(m>='0'&&m<='9')
{
q=(Lnode *)malloc(sizeof(Lnode));
q->next=p->next;
p->next=q;
q->data=(int)(m-48);
if (i==1) n0++;
else n1++;
}
}
p=L1;
}
//将第一个数转变为数组,下标低的存储低位
p=L0->next;
a=(int *)malloc(n0*sizeof(int));
n3=n0;//记录以后计算结果的总位数
cout<<"实际输入的数据:"<<endl;
printf("Number1=");
for(i=0;i<n0;i++)
{
a[i]=p->data;
p->data=0; //将该链表的值置为0
p=p->next;
if(p==NULL) break;
}
for(i=n0-1;i>=0;i--)
printf("%d",a[i]);
//将第二个数转变为数组,下标低的存储低位,并将连表L1释放
p=L1->next;
free(L1);
b=(int *)malloc(n1*sizeof(int));
printf("\nNumber2=");
for(i=0;i<n1;i++)
{
b[i]=p->data;
p_pre=p;
p=p->next;
free(p_pre);
if(p==NULL) break;
}
for(i=n1-1;i>=0;i--)
printf("%d",b[i]);
cout<<endl;
//进行乘法运算
for(j=n1-1;j>=0;j--)
{ temp0=0;
p=L0->next;
for(i=0;i<n0;i++)
{
temp1=a[i]*b[j];
temp0=temp0/10+temp1;
p->data+=temp0%10;
temp2=p->data;
if(temp2>=10)//对相加超过10的数进行梳理
{q=p;
while(q->data>=10)
{
q->data=temp2%10;
q=q->next;
q->data+=temp2/10;
temp2=q->data;
if(q->next==NULL)
{
L1=(Lnode *)malloc(sizeof(Lnode));
q->next=L1;
q->data=temp2%10;
q=L1;
q->data=temp2/10;
n3++;
}
}
}
if(p->next!=NULL) p=p->next;
}
if(temp0/10!=0)
{
if(p->next!=NULL)
while(temp0>=10)
{
p->data=temp0/10+p->data;
temp0=p->data;
if(temp0>=10)
p->data=temp0%10;
if(p->next!=NULL)
p=p->next;
else
break;
}
else
{
q=(Lnode *)malloc(sizeof(Lnode));
n3++;//位数加一位
p->next=q;
p_pre=p;
p=q;
p->next=NULL;
p->data=temp0/10;
temp0=temp0/10;
}
}
//全部向高位移动一位
if(j>0)
{
q=(Lnode *)malloc(sizeof(Lnode));
n3++;//位数加1位
q->next=L0->next;
L0->next=q;
q->data=0;
}
}
c=(int *)malloc(n3*sizeof(int));
i=n3-1;
p=L0->next;
while(p!=NULL&&i>=0)
{
c[i]=p->data;
p_pre=p;
p=p->next;
free(p_pre);
i--;
}
cout<<"计算结果:"<<n3<<"位"<<endl;
printf("Result=");
for(i=0;i<n3;i++)
cout<<c[i];
cout<<endl;
}