日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高效大数乘法 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语言...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。