使用公式來解決問題:給定一個十進制的正整數,將其轉換成指定進制的數。如下所示,在單元格A2中是給定的十進制正整數值,單元格B2中是指定的進制,示例中是4進制,單元格C2中是轉換后的結果,單元格D2中使用公式檢驗結果是否正確。
這里,我們可以看到“結果”列中的值并不依賴于上面的每一行,這次可以使用下面簡單的公式得到3:
=MOD(INT($A$2/10^0),10)
沿著這個思路來構造上述方法的數組版本。我們唯一需要確定的事情是執行計算的數組大小,即在指定進制下所需要的最大指數是多少?
在上面的示例中,顯然需要的是“百”。因此,對于我們的10的指數需要由三個元素組:0、1和2組成的數組。如果考慮值10,301,444,那么顯然需要達到10^7,因此我們的數組將由8個元素組成(從10^0到10^7)。
實際上,這里決定采用一種比較“懶惰”的方法。不是動態確定此值,而是簡單地使用了一個較大的(至少以Excel術語來說)索引上限20。
當然,當我們使用除10以外的進制(基數)時,此過程也沒有什么不同。以本文開始時給出的示例為例,即將552轉換為4進制數,其部分公式為:
B2^(ROW(INDIRECT(“1:20”))-1)
得到一個由20個值組成的數組,該數組由4的0至19次方的結果組成:
{1;4;16;64;256;1024;4096;16384;65536;262144;1048576;4194304;16777216;67108864;268435456;1073741824;4294967296;17179869184;68719476736;274877906944}
然后被552除并向下取整:
FLOOR(A2/{1;4;16;64;256;1024;4096;16384;65536;262144;1048576;4194304;16777216;67108864;268435456;1073741824;4294967296;17179869184;68719476736;274877906944},1)
得到:
{552;138;34;8;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
接著,求除以4的余數:
MOD({552;138;34;8;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0},B2)
得到第一個數組:
{0;2;2;0;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
第二個數組更直接,由10的0至19次方的結果組成:
{1;10;100;1000;10000;100000;1000000;10000000;100000000;1000000000;10000000000;100000000000;1000000000000;10000000000000;100000000000000;1000000000000000;10000000000000000;100000000000000000;1000000000000000000;10000000000000000000}
因此,最后的結果為:
=SUMPRODUCT({0;2;2;0;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}*{1;10;100;1000;10000;100000;1000000;10000000;100000000;1000000000;10000000000;100000000000;1000000000000;10000000000000;100000000000000;1000000000000000;10000000000000000;100000000000000000;1000000000000000000;10000000000000000000})
得到20220。
可以檢驗結果是否正確。如下:
(2X4^4)+(0X4^3)+(2X4^2)+(2X4^1)+(0X4^0)
等于:
(2X256)+(0X64)+(2X16)+(2X4)+(0X1)
等于:
512+0+32+8+0
結果為:
552。