這是我在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 大數運算最關鍵的是用進製理解,就是把乙個陣列元素表示的最大值作為乙個進製 如此,最容易的大數運算也是最耗費空間的就是乙個元素表示一位數字,即用十進位制表示 還有一種折中的方案,是乙...