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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

面试官让你用C语言实现大数相乘,慌吗?

發(fā)布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官让你用C语言实现大数相乘,慌吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在之前的筆試題解析里面,我寫了大數(shù)相加的問題,這里再剖析一個大數(shù)相乘,顧名思義,大數(shù)相乘就是這個數(shù)已經(jīng)大到最大的數(shù)據(jù)類型都沒有辦法保存了。

我們看看最大的數(shù)據(jù)類型可以保存多大的數(shù)據(jù)。

#include?"stdio.h" #include?"string.h" int?main() {printf("0~%llu\n",(1ULL?<<?sizeof(unsigned?long?long)*8)?-1);return?0; }

代碼輸出:

0~18446744073709551615

所以如果我們的數(shù)大于18446744073709551615 就會存在沒有一個數(shù)據(jù)類型可以存儲的情況,所以會有大數(shù)相乘的問題。

如何解決大數(shù)相乘問題?

看我下面的解題思路,這個思路可以也是從網(wǎng)上看到的。

  • 我們拿乘數(shù)的最低位,也就是2358 中的8 依次乘以被乘數(shù)的每一位,然后不做進位處理得到8 16 32 40.

  • 繼續(xù)拿十位,百位,千位相乘,還是不進位

  • 然后依次列相加,相加的時候,也不做進位處理得到一個數(shù)據(jù)2 7 19 40 51 57 40.

  • 后面循環(huán)對上一步得到的數(shù)據(jù)進行進位處理,就會得到最終的結(jié)果。

代碼實現(xiàn)

#include?"stdio.h" #include?"string.h"#define?char_to_int(a)?(int)?(a?-?'0') #define?int_to_char(a)?(char)(a?+?'0')int?main() {char?a[1000]={"1245"};char?b[1000]={"2358"};char?c[1000]={0};int?i?=?0,?j?=?0,?k?=?0;memset(c,0,sizeof(c));printf("%ld\n",strlen(a)-1);printf("%ld\n",strlen(b)-1);/*完成圖片中的1,2步,結(jié)果從數(shù)組開頭開始存放*/for?(i?=?0;?i<strlen(a);?i++){k?=?i;for?(j?=?0;?j<strlen(b);?j++){c[k]?+=?char_to_int(a[i])?*?char_to_int(b[j]);k++;}}printf("k=%d?\n%.2d?%.2d?%.2d?%.2d?%.2d?%.2d?%.2d\n",k,c[0],c[1],c[2],c[3],c[4],c[5],c[6]);/*完成圖片中的3步,從后面往前面*/for?(i?=?k-1;?i>0;?i--){if?(c[i]?>=?10)?{c[i-1]?=?c[i]/10?+?c[i-1];c[i]?=?c[i]%10;printf("%.2d?%.2d?%.2d?%.2d?%.2d?%.2d?%.2d\n",c[0],c[1],c[2],c[3],c[4],c[5],c[6]);}}/*輸出*/for(i=0;i<k;i++)printf("%d",c[i]);putchar('\n');return?0; }

我這個代碼直接參照我上面的圖片例程編寫,比較有參考性,大家在看代碼的時候也需要注意一些細節(jié),比如strlen獲取的長度,k變量的大小等等。

程序輸出:

3 3 k=7 02 07 19 40 51 57 40 02 07 19 40 51 61 00 02 07 19 40 57 01 00 02 07 19 45 07 01 00 02 07 23 05 07 01 00 02 09 03 05 07 01 00 2935710

隨機驗證下代碼

驗證的時候發(fā)現(xiàn)上面寫的代碼還有一些問題,順便修改了下

#include?"stdio.h" #include?"string.h"#define?char_to_int(a)?(int)?(a?-?'0') #define?int_to_char(a)?(char)(a?+?'0')int?main() {char?a[1000]={"1561591985156415641419841516515919"};char?b[1000]={"45645689129812561564159129821985125641"};unsigned?long?long?c[1000]={0};int?i?=?0,?j?=?0,?k?=?0;memset(c,0,sizeof(c));/*完成圖片中的1,2步,結(jié)果從數(shù)組開頭開始存放*/for?(i?=?0;?i<strlen(a);?i++){k?=?i;for?(j?=?0;?j<strlen(b);?j++){c[k]?+=?char_to_int(a[i])?*?char_to_int(b[j]);k++;}}/*完成圖片中的3步,從后面往前面*/for?(i?=?k-1;?i>0;?i--){if?(c[i]?>=?10)?{c[i-1]?=?c[i]/10?+?c[i-1];c[i]?=?c[i]%10;}}/*輸出*/for(i=0;i<k;i++)printf("%llu",c[i]);putchar('\n');return?0; }

代碼輸出:

71279942302056620434200279768171066840415273983925010258196655791579079

但是遺憾的是,電腦自帶的計算器不能計算這么大的數(shù)據(jù),所以,我也不知道這個計算結(jié)果是不是正確的。

所以計算一個計算器可以計算的值

#include?"stdio.h" #include?"string.h"#define?char_to_int(a)?(int)?(a?-?'0') #define?int_to_char(a)?(char)(a?+?'0')int?main() {char?a[1000]={"1844674407"};char?b[1000]={"3709551615"};unsigned?long?long?c[1000]={0};int?i?=?0,?j?=?0,?k?=?0;memset(c,0,sizeof(c));/*完成圖片中的1,2步,結(jié)果從數(shù)組開頭開始存放*/for?(i?=?0;?i<strlen(a);?i++){k?=?i;for?(j?=?0;?j<strlen(b);?j++){c[k]?+=?char_to_int(a[i])?*?char_to_int(b[j]);k++;}}/*完成圖片中的3步,從后面往前面*/for?(i?=?k-1;?i>0;?i--){if?(c[i]?>=?10)?{c[i-1]?=?c[i]/10?+?c[i-1];c[i]?=?c[i]%10;}}/*輸出*/for(i=0;i<k;i++)printf("%llu",c[i]);putchar('\n');return?0; }

程序輸出:

6842914925636017305

計算器輸出

好吧,再來一次

#include?"stdio.h" #include?"string.h"#define?char_to_int(a)?(int)?(a?-?'0') #define?int_to_char(a)?(char)(a?+?'0')int?main() {char?a[1000]={"184467"};char?b[1000]={"3709551615"};unsigned?long?long?c[1000]={0};int?i?=?0,?j?=?0,?k?=?0;memset(c,0,sizeof(c));/*完成圖片中的1,2步,結(jié)果從數(shù)組開頭開始存放*/for?(i?=?0;?i<strlen(a);?i++){k?=?i;for?(j?=?0;?j<strlen(b);?j++){c[k]?+=?char_to_int(a[i])?*?char_to_int(b[j]);k++;}}/*完成圖片中的3步,從后面往前面*/for?(i?=?k-1;?i>0;?i--){if?(c[i]?>=?10)?{c[i-1]?=?c[i]/10?+?c[i-1];c[i]?=?c[i]%10;}}/*輸出*/for(i=0;i<k;i++)printf("%llu",c[i]);putchar('\n');return?0; }

程序輸出

684289857764205

計算器輸出

嗯,好像沒有問題。

其他的大數(shù)相乘算法

我上面的代碼不是最優(yōu)解,但是可以讓大家理解這個過程,如果想了解比較優(yōu)秀的解決方案,可以網(wǎng)上找找資料。

https://en.wikipedia.org/wiki/Sch%C3%B6nhage%E2%80%93Strassen_algorithmhttps://blog.csdn.net/u010983881/article/details/77503519

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關(guān)注公眾號,后臺回復(fù)「1024」獲取學(xué)習(xí)資料網(wǎng)盤鏈接。

歡迎點贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~

嵌入式Linux

微信掃描二維碼,關(guān)注我的公眾號

總結(jié)

以上是生活随笔為你收集整理的面试官让你用C语言实现大数相乘,慌吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。