POJ1220 高精度進製轉換

2021-10-19 17:40:14 字數 2025 閱讀 7171

首先無論是什麼進製,我們要轉換成十進位制的方式進行計算,因為這是高階語言提供提供的計算工具,我們必須藉此進行中轉。

最直觀的思路自然是將輸入轉換成十進位制,再利用短除法轉換成任意進製的輸出,這種想法就面臨著以下兩個問題:

輸入轉換成十進位制可能會溢位,這樣不僅無法直接利用內建資料型別儲存並計算,在轉換時還將產生很多的計算量,可能與我們開始的意願相徑庭。

十進位制轉換為任意進製輸出時,短除法在計算時可能要處理乙個溢位的十進位制數,計算量也很大。

總之,計算將會涉及高精度(以前沒有系統地了解過這一概念,這實際上是一類題目,在後續的部落格中我將集中訓練一下),以上思路在輸入轉十進位制和十進位制轉輸出的兩步均涉及高精度,而且還是加、乘、除、取模均涉及的大整數高精度,這有點太麻煩了。

短除法的核心在於取模和取商,這一題中短除法的關鍵阻礙又在於高精度。高精度除了可以用模擬的方式去解決,還可以用數論的方式,用低精度的「小的數」去組裝高精度的「大數」,從而求其模或者商,這一方法雖然比較難想,需要一些數學知識,但是在計算上往往不麻煩。

這一題就是如此,我們可以不用寫出其十進位制的完整表示,而用一系列的數相加來表示這個十進位制大數。將輸入的數按位轉換成十進位制,那麼其每乙個位都將有乙個輸入進製次冪的位權,二者相乘就得到了這一位所表示的十進位制數的部分。所有位相加,就是我們要的十進位制數。我們如果把這些加數中的每乙個分別取餘再將餘數收集起來再取餘,就可以得到最終整個十進位制大數的餘數。(這個東西好像叫做同餘模定理)

這裡我的第一思路是先對每一位上的十進位制數(乘以位權後的)取模,但是這樣就會有乙個問題,取模之後剩下的商沒辦法再用位權表示了。

於是我們就有了乙個退求其次的思路,把餘數留得多一些,反正最後一次要取模的餘數只要還沒溢位就可以。這樣我們只對每一位上的數字取模,餘數拿出來放到下一位加上去。從高位到低位,每一位都比下一位多乙個該進製大小的基數,乘以這個基數加到下一位即可。這樣一直到最後一位(最低位),累計的餘數全部都在這一位,這一位還剛好就是乙個不會溢位的十進位制數,取模就可以了。各個位上剩下的數就是取餘之後的商。重複這一操作,直到輸入數變為0,就完成了。

#include

#include

#include

using

namespace std;

char dic=

;int

main()

cin >> in_bit >> out_bit;

char str[

1024];

int dec[

1024];

memset

(dec,0,

sizeof

(dec));

int i =0;

getchar()

;while

((str[i]

=getchar()

)!='\n'

) stack<

int> res;

while

(true

) res.

push

(dec[i]

/in_bit)

; dec[i]=0

;bool *** =

false

;for

(int p =

0;p < i;p++)if

(!***)

break;}

cout << in_bit <<

" ";

for(

int q =

0;q < i;q++

) cout << endl << out_bit <<

" ";

while

(!res.

empty()

)

cout << endl << endl;

}}

208kb 16ms

同餘模定理主要有兩條:

(a+b)%c=(a%c+b%c)%c

(a*b)%c=(a%c*b%c)%c

第一條比較好記,第二條就把加換成乘(

poj1220 高精度任意進製轉換

高精度任意進製轉換 是從discuss裡找到的,據說是maigo神牛寫的。超精簡!我自己第一寫的時候,還把n進製先轉成10進製,然後再從10進製轉為m進製。悲催的是寫了好長滴,還沒調對啊!code include include const int maxn 1000 int t maxn a ma...

poj1220 高精度進製轉換模板

include include includeusing namespace std const int maxs 1000 int oldbase,newbase 原進製,新進製 char origin maxs 原串 int str maxs ans maxs goal maxs 被除數,除數,...

poj1220 高精度進製轉換模板題

今天擼3708 一直奇怪的re 就先放下了,寫這個題的過程中學習了乙個高精度進製轉換,用這個模板寫了1220 記錄一下 include include include include include include using namespace std define maxn 10000 char...