[英]Algorithm for printing decimal value of a huge(over 128bits) binary number?
TLDR,在底部:)
簡介:我正在創建一個基本的算術庫(加法,減法,...)來處理大數字。 我面臨的一個問題是將這些巨大的二進制數字打印成十進制數。
我有一個巨大的二進制數存儲在uint64_t數組中。 例如
uint64_t a[64] = {0};
現在,目標是在控制台/文件中打印64 * 64位二進制數作為其十進制值。
初步工作:詳細說明問題我想描述我如何打印十六進制值。
int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
printf("0x%08llX, ", a[i]);
}
輸出:
0x000000FF, 0x00000000,
類似地,對於打印OCT值,我可以從[64]中取出LSB 3位,打印那些位的十進制等效值,3位右移[a]的所有位並繼續重復直到a [64]的所有值都有已被打印。 (以反轉順序打印以保持右側的第一個十進制數字)
我可以通過重復這個單位算法來打印無限大小二進制的十六進制和十月值,但我找不到/開發一個十進制數,我可以一遍又一遍地重復打印[64](或更大的東西)。
我所想到的:我最初的想法是不斷減去
max_64 =(uint64)10000000000000000000; //(i.e.10^19)
的10內部uint64_t中最大的倍數,從a
直到內的值a
比max_64(這基本上等效的較小rem_64 = a%max_64
),並使用打印rem_64值
printf("%019llu",rem_64);
這是數字a
19位十進制數字。
然后做一個類似於(不是代碼)的算術運算:
a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */
並不斷重復和打印19位十進制數字。 (以這樣的方式打印,首先找到19位數字在右邊,然后是左邊的19位數字,依此類推......)。
問題是這個過程很長,我不想使用所有這些來打印dec值。 並且正在尋找一種避免使用這些耗時的算術運算的過程。
我認為必須有一種方法可以通過重復算法來打印巨大的尺寸(類似於Hex和Oct的打印方式),我希望有人可以指出我正確的方向。
我的圖書館可以做什么(到目前為止):
如果需要,我會為其他操作編寫代碼,但如果可能的話,我想實現獨立於庫的打印功能。
考慮這樣的問題:你得到了一個n位的二進制數X(1 <= n <= 64 * 64)你必須以十進制打印出X. 如果絕對需要,您可以使用現有庫,但如果未使用則更好。
TLDR:任何代碼,參考或單位算法,我可以重復打印太大和/或未知大小的二進制的十進制值將是非常有幫助的。 強調算法,即如果有人可以描述一個我將能夠實現它的過程,我就不需要代碼。 提前致謝。
面對這樣的疑慮,並且考慮到有很多bigint庫,看看他們的代碼是很有趣的。 我看了一下Java的BigInteger,它有一個toString
方法,它們做了兩件事:
對於小數字,他們咬緊牙關並做一些類似於你提出的建議 - 直接逐鏈接的基本轉換,在每一步輸出十進制數。
對於大數字,他們使用遞歸Schönhage算法 ,他們在評論中引用,在其他地方引用,
Knuth,唐納德, 計算機編程藝術 ,卷。 2,練習答案(4.4)問題14。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.