大數除法實現方法

2021-10-24 09:11:56 字數 2161 閱讀 9168

這是我在2023年4月12日發布在洛谷上的一篇部落格,今天把它搬運到csdn裡來

//在正式開始之前,我們先來理一下思路,因為除數和被除數都太大了,所以我們不可以用正常的「/」來解決

//那怎麼辦呢?因為除法是減法的高階運算,所以我們可以轉變成低階的減法,那麼就是被除數一直減除數,直到減不了為止

//但是這些數太大了,如果這樣做會太慢,那我們就在想想除法的豎式

//我們以100/5為例 :

/*首先,100首位1除以5,不行

然後,往後加一位,10/5=2,商在第乙個0的上面

最後,最後一位是0,不用管,直接他的頭頂上商0

*///既然我們要盡量不減少內容,那我們就乾脆給除數加0加的和被除數一樣(雖然有加的可能比被除數大,但是減法函式會處理的,後面有體現),最後最後把商商到對應位就可以了

#include

#include

#include

//標頭檔案

using

namespace std;

//命名空間

intjianfa

(int

*p1,

int*p2,

int len1,

int len2)

if(len1==len2)

else

if(p1[i]

}//兩個數經歷上面的磨鍊都確定可以減了,那麼下面就開始吧~

for(

int i=

0;i)//借位操作

}//減法內容

for(

int i=len1-

1;i>=

0;i--)}

//找出位數

return0;

//如果沒有就說明減沒了(例如1-1=0)那就是0位

}int

main()

//如果被除數小於除數那麼直接輸出0(本題不考慮小數)

int j=len1-1;

for(

int i=

0;i) j=len2-1;

for(

int i=

0;i)//確定能除後將被除數和除數分別、依次反向存入a和b兩個int陣列中以便日後做運算

int len=len1;

//因為len1在日後會發生改變,但是日後還需要呼叫到完好的len1,所以這裡進行一下備份

len1=

jianfa

(a,b,len1,len2)

;//先執行一下減法,以便確定一些事情(見下)

if(len1<0)

//如果返回-1(<0)那麼說明不能除,輸出0並結束程式(詳見第五行)

if(len1==0)

//如果返回零,說明一次剛好減完,例如:5/5,按照我們的思路 ,是5-5(因為還沒有給除數添0)

ans[0]

++;//因為第一次已經減了一次了,所以答案別忘了加一

int ntime=len1-len2;

//ntime指的是要給除數添的0,這裡直接是被除數和除數字數的差

if(ntime<0)

//如果要添0的個數小於0(因為這裡剛剛減過一次,所以要再判斷一次)就輸出1(因為減了1次,多以輸出1,和上面判斷len1小於len2是一樣的

for(

int i=len1-

1;i>=

0;i--

)else

}//添0(實在太難表達了,偷個懶,應該······)

len2=len1;

//這樣下來,被除數和除數就一樣長了,這步要注意

for(

int i=

0;i<=ntime;i++)}

//做減法

int bol=0;

//做乙個flag(1、我也不知道我為啥不用flag,2、我們來想用「bool」來用,但是發現是系統關鍵字(好像這個很基本,但是我似乎就是這麼笨))

for(

int i=

0;i//做一下結尾處理(似乎bol這裡沒有到呀)

for(

int i=len-

1;i>=

0;i--)if

(bol)

}//輸出······(1、bol用途在這2、終於完了······)

return0;

}

C 實現大數除法

題外話 大數除法無疑是大數操作裡最麻煩的一項,寫大數不實現除法無異於畫龍無鱗。思路 最原始的,腦子最容易冒出來的思路,是一下一下的減,看能累計減多少次,最後的總次數就是結果,但這樣的效率實在太慢。但我們可以一次性減去 除數的1,10,100,1000倍,只要它在當前倍數下比被除數小。例如 1210 ...

高精度除法 大數除法

問題描述 給出兩個正整數,計算a b的值,保證a和b的位數不超過500位。輸入描述 輸入兩個用空格隔開的正整數。輸出描述 輸出a b的值。樣例輸入 500 2 樣例輸出 250 解題思路 大數除法的實現有兩種方式 1 用a b,迴圈,直到a 計算過程 擴充套件b的位數 a.length b.lent...

大數運算 除法

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