計蒜客 T1101 大整數的因子(高精度除法詳解)

2021-10-08 11:52:58 字數 2736 閱讀 6890

t1101 大整數的因子詳解

題解高精度演算法簡介已經在之前的部落格 計蒜客t1098:大整數加法(高精度加法詳解) 中詳細的介紹過了,這裡就不再贅述了。

大數的儲存方式也在之前的部落格 計蒜客t1098:大整數加法(高精度加法詳解) 中詳細的介紹過了,這裡也不再贅述了。但是我們要注意的是在除法的過程中我們是從最高位開始計算的,而不是像加減乘法一樣從最低位開始計算,但是我們在除法的大整數儲存中依舊是按照先存最低位再存高位。因為往往在乙個高精度問題中不單單會涉及到除法,可能還會有加減乘法運算,所以為了方便我們在儲存大整數的時候都是按照由低位到高位儲存,即倒著儲存。下面來詳細的介紹一下如何實現大整數除法。

首先我們想一下我們在筆算除法的時候的計算步驟,在大整數 a1a2a3a4a5a6 ÷ b 先判斷一下最高位的數字a1能不能除開 b,除不開就落下來然後再計算a1a2 是否能夠除開 b;如果能夠除開那麼就將商寫在上面然後求出餘數 r ;再計算下一位,將餘數 r * 10 + a3,然後再計算商餘數知道將所有的數字都除完,最後就剩下了最終的商和餘數。

計算機中的大整數除法和我們筆算的時候思路是一樣的,首先我們定義乙個餘數 r = 0,定義乙個vector陣列來儲存商。先使 r = r * 10 + a1,然後計算 r / b 的結果,並將其放到vector陣列中,然後使 r %= b,求出當前的餘數再進行下一位的運算即使 r = r * 10 + a2,將 r / 10 的結果放到vector陣列中,然後再計算餘數 r %= b;一直迴圈往復下去直到算完所有的數字。

這裡要注意還有一步操作就是講vector陣列進行翻轉,因為我們在計算商的過程中是按照從最高位開始計算的,所以計算完成之後vector陣列中的商是按照從高位到低位開始儲存的,所以我們需要將其翻轉過來使其從低位到高位儲存方便我們 去除商中的前導零 和 進行下一次的加、減、乘運算。

去除前導零之後我們將結果陣列返回即可,這裡我們將餘數 r 使用引用傳遞,所以最後只需要返回結果的vector陣列即可。返回之後倒著輸出即可。

// 計算 a ÷ b = c ······ r

vector<

int>

div(vector<

int>

&a,int b,

int&r)

// 將結果進行翻轉,reverse()需要使用 標頭檔案

reverse

(c.begin()

, c.

end())

;// 去除前導零

while

(c.size()

>

1&& c.

back()

==0) c.

pop_back()

;//返回結果陣列

return c;

}

#include

#include

#include

using

namespace std;

// 計算 a ÷ b = c ······ r

vector<

int>

div(vector<

int>

&a,int b,

int&r)

// 將結果進行翻轉,reverse()需要使用 標頭檔案

reverse

(c.begin()

, c.

end())

;// 去除前導零

while

(c.size()

>

1&& c.

back()

==0) c.

pop_back()

;//返回結果陣列

return c;

}int

main()

已知正整數 k 滿足 2 ≤ k ≤ 9,現給出長度最大為 30 位的十進位製非負整數 c,求所有能整除 c 的 k。

乙個非負整數 c,c 的位數 ≤ 30。

若存在滿足 c % k = 0 的 k,從小到大輸出所有這樣的 k,相鄰兩個數之間用單個空格隔開;若沒有這樣的 k,則輸出"none"。

輸出時每行末尾的多餘空格,不影響答案正確性

2 3 5 6

由於題目只讓我們輸出大整數 c 在2 <= i <= 9 範圍內的因子,所以我們只需要使用迴圈計算 c ÷ i 的餘數 r 是否為 0 ,所以我們就不需要再計算商為多少,直接迴圈判斷 r 是否為 0 即可。如果 r == 0 ,那麼證明 此時的 i 是大數 c 的因子,那麼就將其儲存到 結果陣列 ans 中,否則就不儲存。

#include

#include

#include

using

namespace std;

intdiv

(vector<

int>

&a,int b)

return r;

}int

main()

}

len = ans.

size()

;if(len)

}else

return0;

}

我是acfun,感謝大家的支援!

計蒜客T1098 大整數加法

求兩個不超過 200 位的非負整數的和。輸入格式 有兩行,每行是乙個不超過 200 位的非負整數,可能有多餘的前導 0。輸出格式 一行,即相加後的結果。結果裡不能有多餘的前導 0,即如果結果是 342,那麼就不能輸出為 0342。輸出時每行末尾的多餘空格,不影響答案正確性 樣例輸入 22222222...

經典例題 大整數加法(計蒜客 T1098)

測試樣例 sample input 22222222222222222222 33333333333333333333 sample output 55555555555555555555 解題思路 大數加法,沒什麼好說的,注意進製,python一步解決。人生苦短,我愛python。pythonac...

計蒜客 T1227 大盜阿福

題目描述 阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。作為一向謹慎作案的大盜,阿福不願意冒著被警察追捕的風險行竊。他想知道...