这是我调试时间最长的程序,整整弄了两天才弄好,不过还有点数组下标越界的小问题没解决!但是结果是正确的!
算法思想:将两个相乘的数分别放在两个数组中,之后用一个数,逐位的乘以另一个数,在将乘积的和放在另一个数组3 中,如果被乘数只有一项,那么结果就是数组3中的值,如果超过两项,需要考虑进位和加法,将数组3中的数进位后(就是在末尾加0)与原来的数组中的数相加。说白了就是基本的乘法!!!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
cheng_fa(int str1[],int str2[],int str3[],int str4[],int count1,int count2)
{
int i=0,j=0,k=0,l=0,s=0,p=0,w=0,m=0,k1=0;
int count3=0,count4=0;
count3=count1;
while(i!=count2)/*对第二个相乘的数遍历*/
{
k=0;
j=0;
count4++;/*记录循环次数*/
for(k1=0;k1!=100;++k1)/*每次循环后都要对str4请零,str4是用来存相乘后的值*/
{
str4[k1]=0;
}
while(j!=count3)/*对第一个相乘的数遍历*/
{
int sum=0,flag=1;
sum=str4[k]+str2[i]*str3[j];/*记下每位的和*/
if(sum<=9)/*小于9就写入str4中*/
str4[k]=sum;
else/*大于9对其进行处理*/
{
flag=0;
str4[k]=sum%10;
str4[++k]=sum/10;
}
if(flag)
k++;
j++;
}
k++;
if(count4==1)/*第二个乘数只是1位的话,将其输入到数组str1中,输出结果*/
{
for(int v=0;v<=k;v++)
str1[v]=str4[v];
}
if(count4>1)/*第二次相乘,需要考虑进位,在末尾添0*/
{
for(s=k-1;s>=0;--s)
{
str4[s+i]=str4[s];
}
for(p=0;p<i;++p)
{
str4[p]=0;
}
for(s=0,p=0;s<k+i;++s,++p)/*做进位后的加法*/
{
int sum=0;
sum=str1[p]+str4[s];
if(sum<=9)/*小于9直接写入*/
str1[p]=sum;
else/*大于9进行处理*/
{
str1[p]=sum-10;
for( w=p+1;w!=count1;w++)
{
if(str1[w]==9)
str1[w]=0;
else
{
str1[w]=str1[w]+1;
break;
}
}
if(w==count1)
{
str1[++p]=1;
p--;
count1++;
}
/*if(str1[count1]>9)/*好像没用*/
{
str1[count1]=0;
count1++;
}*/
m=(k+i-count1)>0?(k+i-count1):0;
count1+=m;
}
}
}
i++;
}
if(count4==1)/*第二个乘数是1位的话*/
{
return 0;
}
return count1;
}
void main()
{
int *str1,*str2,*str3,*str4;
int i,k;
int count1=0,count2=0,count3=0,count4=0;
int flag1=0,flag2=0,flag3=0,flag4=0,flag=1,flag5=1;
char *str5;
str1=(int *)malloc(100);/*分配空间*/
str2=(int *)malloc(100);
str3=(int *)malloc(100);
str4=(int *)malloc(100);
str5=(char *)malloc(100);
if(NULL==str1)
{
printf("allocation failture\n");
exit(1);
}
if(NULL==str2)
{
printf("allocation failture\n");
exit(1);
}
if(NULL==str3)
{
printf("allocation failture\n");
exit(1);
}
if(NULL==str4)
{
printf("allocation failture\n");
exit(1);
}
if(NULL==str5)
{
printf("allocation failture\n");
exit(1);
}
printf("请逐位输入第一个数\n");/*输入第一个乘数*/
gets(str5);
for(i=0;str5[i]!='\0';++i)
{
count1++;
str1[i]=str5[i]-'0';
}
printf("请逐位输入第二个数\n");/*输入第二个乘数*/
gets(str5);
for(i=0;str5[i]!='\0';++i)
{
count2++;
str2[i]=str5[i]-'0';
}
for(i=0;i<count1/2;++i)/*将第一个乘数倒置,因为输入时是从高到低,乘法时是从低到高*/
{
k=str1[i];
str1[i]=str1[count1-i-1];
str1[count1-i-1]=k;
}
for(i=0;i<count2/2;++i)*将第二个乘数倒置,因为输入时是从高到低,乘法时是从低到高*/
{
k=str2[i];
str2[i]=str2[count2-i-1];
str2[count2-i-1]=k;
}
for(i=0,k=0;i!=count1;++i,++k)/*将第一个数组中的数拷贝到数组3,为以后相乘时用(因为需要不变的)*/
{
str3[k]=str1[i];
}
for(i=0;i!=100;++i)/*清0.,以后加法方便*/
{
str4[i]=0;
}
for(i=count1;i!=100;++i)/*清0,以后加法方便*/
{
str1[i]=0;
}
k=count1;
count1=cheng_fa(str1,str2,str3,str4,count1,count2);/*调用函数*/
printf("两个大数的相乘后的结果是\n");
if(count1)
{
for( i=count1+1;i>=0;--i)
{
if(str1[i]==0&&flag5)
;
else
{
printf("%d",str1[i]);
flag5=0;
}
}
printf("\n");
}
else
{
for(int i=k+1;i>=0;--i)
if(str4[i]==0&&flag)
;
else
{
printf("%d",str4[i]);
flag=0;
}
printf("\n");
}
free(str1);
free(str2);
free(str3);
free(str4);
}