2013-03-06 61 views
-2

我對SPOJ以下問題工作數據類型,c - 要很長的數字

http://www.spoj.com/problems/ARITH/

據說數應包含atmost 500位,什麼是一個合適的數據類型numberwith maximun 500 digits

+2

可能的重複[如何創建一個數據類型來保存200多位數字在C?](http://stackoverflow.com/questions/5436007/how-to-create-a-datatype-to-hold- 200-digit-long-numbers-in-c) – 2013-03-06 06:17:43

+0

是的,我使用了一個500字符的字符串,但是爲了進行計算,當我們將該字符串轉換爲一個數字時,問題就到來了。 – Subbu 2013-03-06 06:18:37

+1

這可能不是一個有效的解決方案。但是,爲什麼不使用數組並且從最後一個(n-1)開始執行操作。在需要的地方使用臨時變量(進位,借位等)。再次,這可能不是一個有效的解決方案。 – Gomu 2013-03-06 06:24:31

回答

1

使用GMP庫多精度算術,你會被排序。

http://gmplib.org/

+0

金傑爾,謝謝你的建議! – Subbu 2013-03-06 06:45:20

2

沒有內置數據類型來保存500位數的整數。因此,你必須想出一種方法來將它們存儲在一個字節數組中。

http://gmplib.org/獲取靈感。總之,你必須先存儲數字的地方:

struct Digit { 
    size_t len; 
    char sign; 
    char* digits; 
}; 

然後你必須實現你需要這樣的Digit工作的全部功能:

void digit_init(struct Digit* d); 
void digit_set(struct Digit* d, const char* digits); 
void digit_add(struct Digit* a, struct Digit* b, struct Digit* result); 
void digit_mult(struct Digit* a, struct Digit* b, struct Digit* result); 
0

有存儲許多位在C一些沒有內置的方式。該問題旨在讓您通過其他方式進行算術運算(將數字始終保留爲字符串,並一次處理少量的實際數字)。由於BigInteger,Java中的問題更容易實現(例如)。但是如果你想用c來完成,我會看看BigNum實現如何工作。這可能有助於作爲參考:

http://www.algorithmist.com/index.php/BigNum

0

對於每一個乘法,由第二個數字的每個數字相乘的第一個數字。將部分結果放在另一個的下方,從第二個數字的最後一位開始。每個部分結果應與相應的數字排列「

由於這種約束,沒有實際的替代品 char bignum[MAX_DIGITS+1];

編輯 - 這是我最初的反應。它仍然是有用的,如果有人不需要打印中間結果

由於重點在於編寫數字向下以10爲底,並且由於輸入以10爲底,所以我建議使用10位基本派生數組 - Char s是研究長乘法的好候選者,但將基數擴展到100,1e4,1e6或1e9是有意義的。

基地100將適合uint8_t或字符,基地10000會與uint16_t(雖然16x16 ==> 32乘法是可用的,即使在大多數嵌入式處理器);雙打可以保持精確值高達2^53 -1,這將限制每個被乘數實際上1e6。

使用例如base 1e8允許在(uint32_t)中存儲8位數字,並允許在(uint64_t)中邏輯地存儲乘法結果。它還可以很容易地打印數字,無需將基本2 bignum轉換爲十進制表示所需的長時間分割。

struct big_int { 
    uint32_t digits[MAX_DIGITS/8]; 
    unsigned int length; // 
    int sign;    // or possibly use int length and negative lengths 
}; 
0

據我所知,沒有這樣的內置函數/類型來執行這樣的精度算術。 C和C++都沒有。也不STL。也不提升C++。由於您要將其提交到SPOJ,因此無法鏈接自定義庫。據我所知,如果你堅持使用C,並且你在SPOJ上做了一個問題,你只能編寫你自己的例程或複製粘貼&。

或者,嘗試內置Big-Integer支持的Java/Python。

長話短說,沒有優雅的方式來實現這一點,因爲你要在SPOJ上提交它。