高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...
這是我調試時間最長的程序,整整弄了兩天才弄好,不過還有點數組下標越界的小問題沒解決!但是結果是正確的!
算法思想:將兩個相乘的數分別放在兩個數組中,之后用一個數,逐位的乘以另一個數,在將乘積的和放在另一個數組3 中,如果被乘數只有一項,那么結果就是數組3中的值,如果超過兩項,需要考慮進位和加法,將數組3中的數進位后(就是在末尾加0)與原來的數組中的數相加。說白了就是基本的乘法!!!
#include
#include
#include
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
{
str4[p]=0;
}
for(s=0,p=0;s
{
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
{
k=str1[i];
str1[i]=str1[count1-i-1];
str1[count1-i-1]=k;
}
for(i=0;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);
}
總結
以上是生活随笔為你收集整理的高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux删除文件夹提示没找到,Win1
- 下一篇: 投票选举c语言程序,C语言元旦礼物:经典