大數系列 大數除法以及求模

2021-07-17 04:24:14 字數 1723 閱讀 2179

#include#includechar num1[111], num2[111];

char num3[111];

int d, b = 0;

using namespace std;

int main()

i = 0;

while(num3[i] == '0')

i++;

printf("商 = ");

for( ; i < len1; i++)

printf("\n");

printf("餘數 = ");

printf("%d\n",b);

return 0;

}

大數除法及求模的核心**就是這部分:

for(i = 0; i < len1; i++) 

/*這個實際上就是筆算的原理,比如,128 / 12, 我們筆算的時候,

先計算 1 / 12, 此時的b = 1, num3[0] = 0, b % d = 1;

然後 b = 1 * 10 + 2 = 12, 所以相當於 12 / 12, num3[1] = 1, b % d = 0;

最後 b = 8, num3[2] = 0, b % d = 8;

所以商為10,餘數為8,而餘數也就是模,所以如果說求模,就必須理解好這兩步的反覆執行:

b = b * 10 + num1[i] - '0'; 這是b在與要看的下一位組成乙個新的數字

b = b % d; 這可以理解為b除以d之後的餘數,所以既然能求出商,自然最後迴圈的結果也就能求出模*/

相信你也注意到了,並且對之有疑問,那就是除數是int型,但被除數是字串,這意味著被除數可以非常大,但對除數的大小就有了限制,這也算不上是純粹的大數除法呀,的確如此,但是對於做acm競賽一類題,這個方法是比較常見並且通用的。

最後,我還是堅持把大數連續除法以及求模的**寫了,貼上來

#include#includechar num1[111], num2[111];

int d, b;

int length;//這個用來儲存每個新計算得到的商的長度,以便於反覆運算,否則老用strlen,肯定會出錯

void divide(char a, int c)

i = 0;

j = 0;

while(num2[i] == '0')

i++;

for( ; i < length; i++)

a[j++] = num2[i];

length = j;

}using namespace std;

int main()

printf("最終的商為: ");

for(i = 0; i < length; i++)

printf("%c",num1[i]);

printf("\n");

printf("最終的餘數為: %d\n",b);

return 0;

}

大數運算,佇列實現大數 加法 乘法 除法 模除

以下 可進行大數加法 減法 乘法 除法 餘除,和比較大小的計算 佇列實現 包括負數 include include include include include includeusing namespace std const int mod 1e9 typedef long long ll co...

大數運算 除法

include include include include include using namespace std 大數運算最關鍵的是用進製理解,就是把乙個陣列元素表示的最大值作為乙個進製 如此,最容易的大數運算也是最耗費空間的就是乙個元素表示一位數字,即用十進位制表示 還有一種折中的方案,是乙...

大數除法1

string bignum bigdiv string s1,string s2 else else if f1 1 記錄小數字數 for i 0,b 0,f1 0,sl2 0 iif s2 i 除小數點並進行相應記錄 else else if f1 1 記錄小數字數 s1.erase 0,l1 s...