導航:首頁 > 方法技巧 > 如何找大數乘大數的計算方法

如何找大數乘大數的計算方法

發布時間:2022-04-29 05:15:11

Ⅰ C語言中如何實現大數計算

/*關於任意精度大數的高精度求冪運算

在以前的文章中看到介紹一種演算法,就是使用10000進製法,用數組來存儲數據。
原理如下:
先說計數方法:
十進制和其他進制都是用權和數字(好象這里名詞不對,記不清楚了)來計數的:
比如

num=123456790
這個數的大小就是:
0*10^0+9*10^1+7*10^2+...+1*10^8
我們可以這樣來寫這個數:
123 456 790
令a=123,b=456,c=790
那麼,abc看起來就象和123456790是一樣的

看到這里你明白了吧?
我們可以分段表示一個非常大的數而不必考慮它的溢出,
而只用考慮段數是否大於一個數即可
舉個例子:
上邊,a的最大值是999,bc也同樣都是,我們只用保證這三個數不溢出
那麼,num就不會溢出

再一個乘法.

我們老祖宗給我們留下的算盤,很妙,
它其實就是最基本的計算機之一

我們算乘方時,
只用乘以一個數:
這樣來列式子:
123456790
*2=
--------------
246913580

即:
123 456 790
*2= *2= *2=
----- ----- ------
246 912 (1)580(溢出) 第三段有溢出,加到上一段
----- ----- --------
246 913 580

呵呵,就這樣,打算盤一樣,進位.

至此,我們已經將需要計算的溢出和乘方計算問題解決了,只用看代碼了:
程序用一個含有1024個無符號整數(上限65536)的數組來存放各段數據
每一個數是一段,每一個數據可以表示9999這么大的數(便於進位)
計算一次,檢查是否超過9999,如果超過,把這一段減去10000,
然後向上一個位(即上一個數)進1(這可以稱為 "一萬進制 ")
程序可以計算小於2的13605次方,大於0次方的任意的二的乘方

其實這樣算起來一點也沒有必要,不過,我覺得好玩,過癮.
另外,藉助對數,可以很輕松的算出這些來,
相比之下,本程序無任何誤差而已

我稱這個演算法為 " '一萬進制 '算盤法 ":

*/
#include "stdio.h "
int main(void)
{
static unsigned int temp[1024];/*分段儲存數據*/
unsigned int position=1;/*記錄共有幾段*/
int overflow=0; /*記錄在算每一段時是否溢出*/
long
times=10000,tm_cnt,sgn_cnt;/*默認10000次計算,可以更改,兩個計數器(乘方次數,段的位置)*/
temp[0]=2;/*初始值為2*/
if(times> 13000)
{
printf( "your input is too large ");/*檢查輸入是否越界*/
exit(0);
}
/*開始計算,外層為乘方次數,內層為每一位計算*/
for(tm_cnt=0;tm_cnt <times-1;tm_cnt++)
{
for(sgn_cnt=0;sgn_cnt <position;sgn_cnt++)
{

temp[sgn_cnt] < <=1;/*相當於乘2*/
if(overflow==1) /*檢查上次是否有溢出*/
{
/*有的話,將溢出加到這一段,同時置溢出為0*/
++temp[sgn_cnt];
overflow=0;
}

if(temp[sgn_cnt]> 9999)
{
/*檢查本次是否溢出,溢出的話,*/
temp[sgn_cnt]-=10000;
overflow=1;
}

}
if(overflow==1)
{
++position;
++temp[sgn_cnt];
overflow=0;
}
if(position> 1023)
{

printf( "times: %d error! ",tm_cnt);
exit(1);
}
}

printf( "%d ",temp[sgn_cnt-1]);
for(sgn_cnt=position-2;sgn_cnt> =0;sgn_cnt--)
{
if(temp[sgn_cnt] <1000)
printf( "0 ");
if(temp[sgn_cnt] <100)
printf( "0 ");
if(temp[sgn_cnt] <10)
printf( "0 ");
printf( "%d ",temp[sgn_cnt]);
if((sgn_cnt+1)%15==0)
printf( "\n ");
}
return 0;
}

2的1000次方:
199 5063 1168 8075
8384 8837 4216 2683 5850 8382 3496 8318 8619 2454 8520 0894 9852 9438 8302
2194 6631 9199 6168 4036 1945 9789 9331 1294 2320 9124 2715 5649 1349 4137
8111 7593 7859 3209 6323 9578 5573 0046 7937 9452 6765 2465 5126 6059 8955
2055 0086 9181 9331 1542 5086 0846 0618 1046 8550 9074 8660 8962 4888 0904
8989 4838 0092 5394 1633 2578 5062 1568 3094 7390 2556 9123 8806 5225 0966
4387 4441 0467 5987 1626 9854 5322 2868 5381 6169 4315 7756 2964 0762 8368
8076 0732 2285 3509 1641 4761 8395 6381 4589 6946 3899 4108 4096 0536 2678
2106 4621 4273 3339 4036 5255 6564 9530 6031 4268 0234 9694 0033 5934 3166
5145 9297 7732 7966 5775 6061 7258 2031 4079 9419 8179 6073 7824 5683 7622
8003 7302 8854 8725 1900 8344 6458 1454 6505 5792 9601 4148 3392 1615 7345
8813 9257 0953 7976 9119 2778 0082 6957 7356 7444 4123 0620 1875 7836 3255
0272 8323 7892 7071 0373 8028 6639 3031 4281 3324 1401 6241 9567 1690 5740
6141 9654 3423 2463 8801 2488 5614 7305 2074 3199 2259 6117 9625 0130 9928
6024 1708 3408 0760 5932 3201 6126 8492 2884 9625 5841 3128 4406 1536 7389
5148 7114 2563 1511 1089 7455 1420 3313 8202 0293 1640 9575 9646 4756 0104
0584 5841 5660 7204 4962 8670 1651 5061 9206 3100 4186 4222 7590 8670 9005
7460 6417 8569 5191 1456 0550 6825 1250 4060 0751 9842 2618 9805 9237 1180
5444 4788 0729 0639 5242 5483 3922 1982 7074 0447 3162 3767 6084 6613 0337
7870 6039 8034 1319 7133 4936 5462 2700 5631 6993 7455 5082 4178 0972 8109
8329 1314 4035 7187 7524 7685 0985 7276 9379 2643 3221 5993 9987 6886 6608
0836 8837 8380 2764 3282 7751 7227 3657 5727 4478 4112 2943 8973 3810 8616
0742 3253 2919 7481 3120 1976 0417 8281 9656 9747 5898 1645 3125 8434 1359
5986 2784 1301 2818 5406 2834 7664 9088 6905 2104 7580 8826 1582 3961 9857
7012 2407 0443 3058 3075 8690 3931 9604 6034 0497 3156 5832 0867 2105 9133
0090 3752 8234 1553 9745 3943 9771 5257 4552 9051 0212 3109 4732 1610 7534
7482 5740 7752 7398 6348 2984 9834 0756 9379 5564 6638 6218 7456 9499 2790
1657 2103 7013 6443 3135 8172 1431 1791 3982 2298 3845 8473 3444 0270 9641
8285 1005 0729 2774 8364 5505 7863 4501 1008 5298 7812 3894 7392 8699 5408
3434 6158 8070 4395 9118 9858 1514 5779 1771 4361 9698 7281 3145 9483 7832
0208 1474 9821 7185 8011 3890 7122 8250 9058 2681 7436 2205 7747 5921 4176
5371 5687 7256 1490 4582 9049 9246 1028 6300 8153 5583 3081 3010 1987 6758
5623 4343 5389 5540 9175 6234 0084 4887 6264 3568 6488 3351 9463 7203
7729 3240 0944 5624 6923 2543 5040 0678 0272 7383 7755 3764 0672 6898 6362
4103 7491 4109 6671 8557 0507 5909 8100 2467 8988 0178 2719 2595 3381 2824
2195 4028 3027 5940 8448 9550 1467 6668 3896 9799 6886 2416 3631 3376 3939
0337 3455 8014 0763 6741 8777 1105 5384 2257 3949 9110 1864 6821 9696 5816
5148 5130 4942 2236 9947 7147 6306 9155 4682 1768 2876 2003 6277 7257 7237
8136 5331 6111 9681 1280 7926 6948 1887 2012 9864 3660 7685 5163 9860 5346
0229 7871 5575 1794 7385 2463 6944 6923 0878 9426 5948 2170 0805 1120 3223
6549 6288 1690 3573 9121 3683 3839 3591 7564 1873 3850 5109 7027 1613 9154
3959 0991 5981 5465 4417 3363 1165 6936 0311 2224 9937 9699 9922 6781 7323
5802 3111 8626 4457 5299 1357 5817 5008 1998 3923 6284 6152 4988 1088 9602
3224 4362 1737 7161 8086 3570 1546 8484 0586 2232 9792 8538 7562 3486 5564
4053 6962 6220 1896 3571 0288 1236 1567 5125 4333 8303 2700 2909 7668 6505
6855 7157 5055 1672 7518 8991 9412 9711 3376 9014 9916 1813 1517 1544 0077
2865 0573 1895 5745 0920 3301 8530 4847 1138 1831 5407 3240 5331 9038 4620
8403 6421 7637 0391 1550 6397 8900 0742 8536 7219 6280 9034 7797 4533 3204
6836 8795 8685 8023 7952 2186 2912 0080 7428 1955 1317 9481 5762 4448 2985
1846 1509 7048 8802 7274 7215 7468 8131 5947 5040 9732 1150 8049 8190 4558
0341 6826 9497 8714 1316 0632 1068 6391 5116 8177 4304 7925 9670 9376

Ⅱ 大數乘法 用什麼演算法啊

大數乘法基本上是乘法豎式筆算的代碼化。
基本功能有3個
1.
大數的數組表示。
2.
大數乘以小數,得到大數。
3.
大數加大數,得到大數。
對於1,其實就是int數組的每個元素存儲若干位。比如每個元素保存4個十進制位。[0]存儲個十百千,[1]存儲萬、十萬、百萬、千萬,諸如此類。一個數組保存一個大數。因此需要一個額外的int變數記錄當前數組用了多少個元素(類似於字元串長度)。
對於2,「小數」指的是能用一個int保存的數。注意這里只限4個二進制位(和1里提到的位數一致)。
比如1
2345
6789這個數字,[0]保存6789,[1]保存2345,[2]保存1。長度3。
這個大數乘以小數,比如9999,過程就是[0]
*
9999,即6789
*
9999
=
6788
3211,積的低四位(%10000)3211保存到積(大數)的[0],剩下6788的進位到[1]。
然後2345
*
9999
= 2344
7655,加上剛才進位上來的6788得到2345
4443,其中4443保存到積(大數)的[1]中,2345進位到[2]。
以此類推。
對於3,基本只要一個for,對位相加然後注意進位就行了。
大數乘以大數,其實就是第一個大數先乘以第二個大數的[0](大數乘小數,上面的2),得到一個大數a0;然後第一個大數乘以第二個大數的[1],又得到一個大數a1……最後再將a0、a1、……加起來(也就是大數加法,上面的3)。加的時候要注意,a1的[0]要和a0的[1]對齊,a2的[0]要和a1的[1]和a0的[2]對齊……這個也和我們豎式筆算一樣。
ps:上面的演算法基本上是「10000進制數」的計算方式。如果數組的每個元素只保存1個十進制位,那就是10進制數。之所以用10000進制,純粹是程序員感覺上好一些。最有效的利用,是每個int保存2的15次方,也就是32768進制。要注意到,如果用10進制計算的話,程序的計算耗時會變成10000進制的16倍,也就是效率變成1/16。
ps2:用int數組的話,位數最多隻能是4位。因為5位數相乘可能得到11位數,超出了int表示範圍。

Ⅲ 求高人給我講大數的乘除法 如99999x77778 還要有更大的數 數位更多 這種題什麼竅門啊

99999*77778
=(100000-1)*77778
=100000*77778-1*77778
=100000-77778
=100000-(70000+7000+700+70+8)
=100000-70000-7000-700-70-8
=30000-7000-700-70-8
=23000-700-70-8
=22300-70-8
=22230-8
=22222
方法就是把最接近整百整千整萬…的數字變成整(百千…)減去它們的差,還有就是加如:
10010*888
=(10000+10)*888
=10000*888+10*888
=8880000+8880
=8888880

Ⅳ 大數定律是怎麼運算的有人知道嗎

大數定律(laws of large number)
編輯本段【基本概念】
概率論歷史上第一個極限定理屬於貝努里,後人稱之為「大數定律」。概率論中討論隨機變數序列的算術平均值向常數收斂的定律。概率論與數理統計學的基本定律之一。又稱弱大數理論。
編輯本段【主要含義】
在隨機事件的大量重復出現中,往往呈現幾乎必然的規律,這個規律就是大數定律。通俗地說,這個定理就是,在試驗不變的條件下,重復試驗多次,隨機事件的頻率近似於它的概率。比如,我們向上拋一枚硬幣,硬幣落下後哪一面朝上本來是偶然的,但當我們上拋硬幣的次數足夠多後,達到上萬次甚至幾十萬幾百萬次以後,我們就會發現,硬幣每一面向上的次數約占總次數的二分之一。偶然必然中包含著必然。
編輯本段【發展歷史】
1733年,德莫佛——拉普拉斯在分布的極限定理方面走出了根本性的一步,證明了二項分布的極限分布是正態分布。拉普拉斯改進了他的證明並把二項分布推廣為更一般的分布。1900年,李雅普諾夫進一步推廣了他們的結論,並創立了特徵函數法。這類分布極限問題是當時概率論研究的中心問題,卜里耶為之命名「中心極限定理」。20世紀初,主要探討使中心極限定理成立的最廣泛的條件,二三十年代的林德貝爾格條件和費勒條件是獨立隨機變數序列情形下的顯著進展。 貝努里是第一個研究這一問題的數學家,他於1713年首先提出後人稱之為「大數定律」的極限定理。
編輯本段【舉例說明】
例如,在重復投擲一枚硬幣的隨機試驗中,觀測投擲n次硬幣中出現正面的次數。不同的n次試驗,出現正面的頻率(出現正面次數與n之比)可能不同,但當試驗的次數n越來越大時,出現正面的頻率將大體上逐漸接近於1/2。又如稱量某一物體的重量,假如衡器不存在系統偏差,由於衡器的精度等各種因素的影響,對同一物體重復稱量多次,可能得到多個不同的重量數值,但它們的算術平均值一般來說將隨稱量次數的增加而逐漸接近於物體的真實重量。由於隨機變數序列向常數的收斂有多種不同的形式,按其收斂為依概率收斂,以概率 1 收斂或均方收斂,分別有弱大數定律、強大數定律和均方大數定律。常用的大數定律有:伯努利大數定律、辛欽大數定律、柯爾莫哥洛夫強大數定律和重對數定律。
設有一隨機變數序列,假如它具有形如(1)的性質,則稱該隨機變數服從大數定律。
伯努利大數定律設μn為n重伯努利實驗中事件A發生的次數,p為每次實驗中A出現的概率,則對任意的ε>0,有(2)成立。
馬爾可夫大數定律對隨機變數序列,若(3)成立,則服從大數定律,即對任意的ε>0,(1)式成立。
辛欽大數定律設為獨立同分布的隨機變數序列,若Xi的數學期望存在,則服從大數定律,即對任意的ε>0,(1)成立。

Ⅳ 請構造一個大整數乘法的計算方法,並用函數實現,原型為: int mul(int a[], int n, int b);

#include<iostream>
using namespace std;
int mul(int a[], int n, int b)
{
int c = 0, d = 0, i = 0;
for (int j = 0; j < n; j++)
{
d = ((a[j] + c) * b) % 10;
c = (a[j] + c) * b / 10;
a[j] = d;
i++;
}
while (c > 0)
{
a[i++] = (c % 10);
c /= 10;
}
return i;
}
void main()
{
int n, a[10000], m = 0, p;
a[0] = 1;
cin >> n;
p = n;
while (p)
{
a[m] = p % 10;
m++;
p /= 10;
}

m = mul(a, m, 123456);

for (int j = m - 1; j >= 0; j--)
cout << a[j];
}

Ⅵ 如何實現大數相乘

網上搜的,評分較高的。
/*--------------------------------------------------------------------------
*函數名稱: 大數乘法
*函數過程:1 輸入兩個大數作為字元串
* 2 作一個雙向鏈表
* 3 兩個指針分別指向數字字元串的最低位
* 4 以第一個數的最低的一個位乘以第二個數的所有項存於鏈表中
* 5 鏈表首指針移
* 6 重復4,5依次從最低位乘到最高位
* 7 乘完後因為最低位是鏈表首,最後一位是鏈表尾。所以在逆順輸出鏈表。
* 4 直到循環結束
*入口參數:numa,numb,result字元串
*出口參數:無
*--------------------------------------------------------------------------*/
void multiply(char *numa, char *numb ,char *result)//用來儲結果的)//計算乘積
{
char *pna = findend(numa);//指向numa的一個指針。point numa pna 指向乘數的最低位,
char *pnb = findend(numb);//指向numb的一個指針 //pnb 指向被乘數的最低位,
int along=(int)strlen(numa);//標記數字a的長度;
int blong=(int)strlen(numb);//標記數字b的長度;
int carry=0,temp_result;//存貯進位 和臨時結果的
Node *head, // 用於存貯頭指針
*pstart, // 用於存貯計算時的首指針
*pnew, //作於申請新結點
*pgo; //作為每計算完一行時,回到下一行起始節點用,移位標致來用
head = pstart =new Node;//初始化首結點和頭結點。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
while (along--)
{
pgo = pstart;//保存進位點
blong = (int)strlen(numb);//初始化長度
pnb = findend(numb); //初始化指針
while ((blong-- && (blong>=0))|| carry != 0)
{
if(!pstart->next)//如果當前為空結點,則申請新結點
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
if(blong<0)temp_result = carry ;//處理只有進位的情況
else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry);//自身值+新值+進位作為新值
pstart -> data = temp_result%10; //存貯個位
carry = temp_result/10; //存貯進位
pstart = pstart -> next; //結點移動
pnb--; //指針移向被乘數高位
}
pstart = pgo->next; //前進一個位置;
pna--; //指針移向乘數高位
}
pstart =head;//尋找鏈表的結尾點
while(pstart->next != 0)
{
pstart->data += 48;//!!<<<因為我們的輸出是字元。所以再此加上48>>>> 逆順輸出
pstart = pstart->next ;
}
int tip = 0;//轉為字元串用
pstart = pstart->ahead ;//找有效字
while(pstart != 0)//輸出正序的結果;
{
result[tip++] = pstart->data;
pstart = pstart->ahead ;
}
result[tip] = '\0';
pstart =head; //釋放空間
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}

Ⅶ 如何輸入一個大數 很大的數 並進行計算的

我覺得可以把很大的數看成是字元串,先將字元串輸入到變數里,然後把他分解成計算機能計算的數據。然後通過atoi函數把分解後的字元串變成數據。
例子:
char s[] = "";
char a1[] = 數組s的前8位
char a2[] = 8到16位.............依次分解數組s
int n = atoi(a1);//依次變字元串為整數
然後進行數學計算,
計算完在把數據變成字元串 itoa()
然後再把a1,a2....數組連起來 就是最後的值了

Ⅷ 如何實現兩個超大整數的相乘

*函數名稱: 大數乘法
*函數過程:1 輸入兩個大數作為字元串
* 2 作一個雙向鏈表
* 3 兩個指針分別指向數字字元串的最低位
* 4 以第一個數的最低的一個位乘以第二個數的所有項存於鏈表中
* 5 鏈表首指針移
* 6 重復4,5依次從最低位乘到最高位
* 7 乘完後因為最低位是鏈表首,最後一位是鏈表尾。所以在逆順輸出鏈表。
* 4 直到循環結束
*入口參數:numa,numb,result字元串
*出口參數:無
*--------------------------------------------------------------------------*/
void multiply(char *numa, char *numb ,char *result)//用來儲結果的)//計算乘積
{
char *pna = findend(numa);//指向numa的一個指針。point numa pna 指向乘數的最低位,
char *pnb = findend(numb);//指向numb的一個指針 //pnb 指向被乘數的最低位,
int along=(int)strlen(numa);//標記數字a的長度;
int blong=(int)strlen(numb);//標記數字b的長度;
int carry=0,temp_result;//存貯進位 和臨時結果的
Node *head, // 用於存貯頭指針
*pstart, // 用於存貯計算時的首指針
*pnew, //作於申請新結點
*pgo; //作為每計算完一行時,回到下一行起始節點用,移位標致來用
head = pstart =new Node;//初始化首結點和頭結點。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
while (along--)
{
pgo = pstart;//保存進位點
blong = (int)strlen(numb);//初始化長度
pnb = findend(numb); //初始化指針
while ((blong-- && (blong>=0))|| carry != 0)
{
if(!pstart->next)//如果當前為空結點,則申請新結點
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
if(blong<0)temp_result = carry ;//處理只有進位的情況
else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry);//自身值+新值+進位作為新值
pstart -> data = temp_result%10; //存貯個位
carry = temp_result/10; //存貯進位
pstart = pstart -> next; //結點移動
pnb--; //指針移向被乘數高位
}
pstart = pgo->next; //前進一個位置;
pna--; //指針移向乘數高位
}
pstart =head;//尋找鏈表的結尾點
while(pstart->next != 0)
{
pstart->data += 48;//!!<<<因為我們的輸出是字元。所以再此加上48>>>> 逆順輸出
pstart = pstart->next ;
}
int tip = 0;//轉為字元串用
pstart = pstart->ahead ;//找有效字
while(pstart != 0)//輸出正序的結果;
{
result[tip++] = pstart->data;
pstart = pstart->ahead ;
}
result[tip] = '\0';
pstart =head; //釋放空間
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}

Ⅸ C語言編程求兩個大數的乘積,幫忙看一個程序分析一下

voidcompute(char*a,char*b,char*c)
{
inti,j,m,n;
longsum,carry;
m=strlen(a)-1;//第一個乘數的位數
n=strlen(b)-1;//第二個成熟的位數
for(i=m;i>=0;i--)a[i]-='0';//將數字字元轉變成數
for(i=n;i>=0;i--)b[i]-='0';//將數字字元轉變成數
c[m+n+2]='';//積的字元串末尾置0
carry=0;//進位。下面是從個位起逐位計算每一位的數值,用的方法與人工列豎式計算完全一樣
for(i=m+n;i>=0;i--)//從積個位(最後面)到最高位(最前面)
{
sum=carry;//該位累加,先加上後面一位計算中的進位
if((j=i-m)<0)j=0;//第i位的計算與第一個乘數中i位之前的各位沒有關系
for(;j<=i&&j<=n;j++)sum+=a[i-j]*b[j];//循環計算有關各位相乘的積並累加
c[i+1]=sum%10+'0';//計算累加結果的個位,就是當前位的值,+'0'轉化成字元
carry=sum/10;//計算結果除以10,是向前面一位的進位
}
if((c[0]=carry+'0')=='0')c[0]='40';//前面的0改成空格
}

..........12345--------a

..........x1234--------b

--------------

..........49380

.......37035

....24690

..12345

--------------

..15233730

積的:

個位:b的個位×a的個位=4×5=20,個位0,進位2;

十位:後面進位+b的個位×a的十位+b的10位×a的個位=2+4×4+3×5=33,十位3,進位3

百位:後面進位+b的個位×a的百位+b的10位×a的十位+b的100位×a的個位=3+4×3+3×4+2×5=37,百位7,進位3

千位:後面進位+b的個位×a的千位+b的10位×a的百位+b的100位×a的10位+b的千位×a的個位=3+4×2+3×3+2×4+1×5=33,百位3,進位3

其餘類推。

..........12345--------a

..........x1234--------b

--------------

..................20....4×5

................16....4×4

................15....3×5

-----------

................33

..............12....4×3

..............12....3×4

..............10....2×5

----------

..............37

..............8....4×2

..............9....3×3

..............8....2×4

..............5....1×5

---------

............33

............4....4×1

............6....3×2

............6....2×3

............4....1×4

--------

.........23

.........3....3×1

.........4....2×2

.........3....1×3

------

.......12

.......2....2×1

.......2....1×2

-----

.......5

.....1....1×1

--------------

....15233730

Ⅹ c語言大整數乘法

dc這個函數裡面連b這個參數都沒有使用,這也能出結果...,

if(z[0]='0')continue 也寫錯了

不是打擊你,你的代碼太濫了,實在不想去找錯誤,給你我以前寫的代碼吧,你自己整理一下

#include <stdio.h>

int mulx(char * a,int b,char * r,int d);
void init(char * s);

char buf1[4*1024];
char buf2[4*1024];
char buf3[4*1024];
int main()
{
char * a;
char * b;
char * r;
char * t;
int d;
int i;

a = buf1;
b = buf2;
r = buf3;

init(NULL);

while(scanf("%s %d",a,&d)!=EOF)
{
mulx(a,d,r,10);
printf("%s\n",r);
}

return 0;
}

char c2d[256]; //字元轉換成數字
char * charset; //代表數字的字元

/*功能:設置使用那些字元表示數字,默認的為"0123456789ABCDEF"*/
/*參數:*/
/*返回值:*/
void init(char * s)
{
int i;
if(s==NULL)
charset = "0123456789ABCDEF";
else
charset = s;
for(i=0;i<256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}

/*功能:清除前導零*/
/*參數:需要清楚的數字*/
/*返回值:清零後數字的位數*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[i];i++,j++)
a[j] = a[i];
a[j] = 0;
if(j==0)
{
a[j++] = charset[0];
a[j] = 0;
}
return j;
}

/*功能:乘,用於進制轉換之類*/
/*參數:a 和 b 分別為乘數,結果保存到 r , d 為使用的進制*/
/*注意:r 可以等於 a , b一定要小於d, 如果被乘數有前導0 則結果也會有前導0*/
/*返回值:結果的位數*/
int mulx(char * a,int b,char * r,int d)
{

int i,j,k,len;
int c,t;

if(r==NULL)
r = a;
for(i=0;a[i];i++);

len = k = i;
for(c=0,i--,r[k--]=0;i>=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i>=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}

閱讀全文

與如何找大數乘大數的計算方法相關的資料

熱點內容
駁口金油使用方法 瀏覽:857
足背伸的鍛煉方法 瀏覽:794
牛舍風機安裝方法 瀏覽:392
道路綠地覆蓋率的計算方法 瀏覽:766
做木珠子最簡單的方法 瀏覽:396
燈光控制手機的使用方法 瀏覽:81
目的基因檢測的步驟和方法是什麼 瀏覽:676
分數混合計算方法總結 瀏覽:370
英語教學方法有哪些直接法情景法 瀏覽:928
分析和綜合思維方法的運用 瀏覽:783
aca電蒸鍋使用方法 瀏覽:851
畫疊被子的簡便方法 瀏覽:362
舞蹈正確踢腿方法 瀏覽:822
企鵝支架訓練方法 瀏覽:572
常用的安全風險分析評估方法有哪幾種 瀏覽:3
配音秀中測試方法哪裡看 瀏覽:628
人生解決問題方法 瀏覽:101
毛線打結方法視頻 瀏覽:809
蘋果手機里緩存的騰訊視頻在哪裡設置方法 瀏覽:636
常用表示溶液的方法有 瀏覽:934