假設我有一個使用unsigned long(int64) 陣串列示的非常大的數字,我希望看到它的 base10 形式存盤在字串中和/或直接將其顯示為標準輸出,我將如何在 C 或 C 中做到這一點如果不使用 gmp 或 boost 之類的庫,我應該知道什么演算法或方法?
下面是一個示例 base2^64 數字,其 base10 值在評論中
// base2^64
unsigned long big_num[3] = [77478, 656713, 872];
// base10 = 26364397224300470284329554475476558257587048
我不完全知道這是否是將另一個數字基數轉換為基數 10 的正確方法,但這就是我所做的:
為了獲得 base10 值26364397224300470284329554475476558257587048,我將 base2^64 數字的所有數字相加,乘以它的基數并乘以數字的索引。
base10 = ((77478 * ((2^64)^2)) ((656713 * ((2^64)^1))) ((872 * ((2^64)^0)))) = 26364397224300470284329554475476558257587048
唯一的問題是沒有原始資料型別可以容納這個超大和......
我只是在想圖書館是否喜歡boost cpp_int并gmp代表他們的數字,如果是,他們如何將其轉換為字串形式的 base10 值或以標準輸出顯示 base10 值?
或者他們是否只使用他們使用的資料型別的一半位,例如unsigned long,可能使用基數 10000 之類的東西?
uj5u.com熱心網友回復:
重復“mod 10”陣列以找到下一個最低有效十進制數字,然后“除以 10”。根據需要重復。
避免unsigned long編碼 64 位值,因為它可能只有 32 位。
如果代碼可以對不使用最寬型別的數字進行編碼并使用uin32_t,那么重復陣列的“mod 10”并不是那么難。
下面的說明性代碼仍然需要反轉字串 - 留給 OP 的東西。潛在的其他疣也 - 因此使用大量庫來處理這類事情的優勢。
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
// Form reverse decimal string
void convert(char dec[], size_t n, uint32_t b32[]) {
// TBD code to handle 0
while (n > 0 && b32[0] == 0) {
b32 ;
n--;
}
while (n > 0) {
unsigned char rem = 0;
// Divide by 10.
for (size_t i = 0; i < n; i ) {
uint64_t sum = rem * (1ULL << 32) b32[i];
b32[i] = (uint32_t) (sum / 10u);
rem = (unsigned char) (sum % 10u);
}
*dec = (char) (rem '0');
if (b32[0] == 0) {
b32 ;
n--;
}
}
*dec = 0;
}
樣本
int main() {
// unsigned long big_num[3] = [77478, 656713, 872];
uint32_t big_num[6] = {0, 77478, 0, 656713, 0, 872};
size_t n = sizeof big_num / sizeof big_num[0];
char s[sizeof big_num * 10 1];
convert(s, n, big_num);
printf("<%s>\n", s);
// <84078575285567457445592348207400342279346362>
// 26364397224300470284329554475476558257587048
}
uj5u.com熱心網友回復:
要獲得這個數字的十進制表示,您需要將該數字反復除以 10 并取余數以獲得小數位數。這意味著您需要對大數實作長除法,這也需要實作長加法、減法和乘法。
大數字庫為您提供了很多代碼,所以只需使用一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425700.html
上一篇:如何從另一個視圖設定過濾器?
