华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言

这是我调试时间最长的程序,整整弄了两天才弄好,不过还有点数组下标越界的小问题没解决!但是结果是正确的!

算法思想:将两个相乘的数分别放在两个数组中,之后用一个数,逐位的乘以另一个数,在将乘积的和放在另一个数组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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值