2012-06-14 19 views
5

N-ikili basamaklı tamsayı el ile yazdırmak için ölçeklenebilir bir algoritma olan long long, değeri long long. Ben birlikte printf ve arkadaşlar biliyorum <cstdio> üzerinde büyük olasılıkla domuz-sırtları standart türleri için bu yerleşiğini var, ama N bayt oluşan bir tamsayı için bunu yapmak istiyorum <iostream> (.N-baytlık tamsayı elle yazdırma

Bu konuda düşündüm ve biraz googled, ama her zaman önceden var olan GMP gibi bigint libirary (ben hiç aşina değilim bir kod temeli) ya da "kullanım printf" veya en yararlı "Bu zor" kullanarak gelir.

tam sayı temelde:

template<size_t N> 
class Integer{ 
... 
private: 
    int8_t first; 
    uint8_t rest[N-1]; 
} 

çok w Integer<4> sitesindeki bayt yeniden yorumlayan Bir int32_t olsun. Bunu N> 8'e ölçeklendirmek istiyorum. Verimlilik şu anda benim endişem değil. Endensellik de değil (x86 için).

+2

Numarayı ondalık olarak yazdırmanız gerekiyor mu? – NPE

+0

@aix yes decimal bu fikir olurdu. – rubenvb

+0

Benim tavsiyem zaten bir bigint kütüphanesi kullanmak olurdu; Bu kütüphaneler ayıklanır ve kanıtlanır. Kendi kodunuzdaki kusurları nasıl bulacaksınız? Sonuçları kalemle veya kağıtla veya Excel'de doğrulamak gibi değil. – tomdemuyt

cevap

5

Adım 1: Define dize biçiminde iki yetkilerini içeren bir arama tablosu:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...}; 

Adım 2: dize biçiminde iki sayıları toplayan bir fonksiyon yazın.

Adım 3: Numaranızdaki bitler boyunca yineleyin ve 1 bitlere karşılık gelen tüm dizeleri ekleyin.

Adım 4: Sonucu yazdırın.

Bu yaklaşımı çok büyük kayan nokta sayılarını yazdırmak için kullandım ve benim için iyi çalıştı.

+0

Çok akıllı Fred! –

+2

2'nin güç tablosuna bile ihtiyacınız yok: sadece sayıyı 2 ile çarpmak için kendinize ekleyin; bir bit 1 ise sayıya 1 ekleyin; Tekrarla ==> kar – anatolyg

+0

Sadece pozitif sayılar için çalıştığına dikkat edin, ancak kolayca düzeltilebilir. Parlak. –

2

ondalık sayıyı çıkarmaya yarayan temel bir özyinelemeli algoritması:

şimdilik tanımsız yardımcı işlevlerini bıraktım
void negate(Integer & number); // modifies the input 
int divide_by_10(Integer & number); // modifies the input 
bool is_zero(const Integer & number); 

void output_number(Integer number) 
{ 
    if (number.first < 0) 
    { 
     cout << "-"; 
     negate(number); 
    } 
    if (is_zero(number)) 
    { 
     cout << "0"; 
     return; 
    } 
    int remainder = divide_by_10(number); 
    if (!is_zero(number)) 
     output_number(number); 
    char digit[] = {'0', 0}; 
    digit[0] += remainder; 
    cout << digit; 
} 

, belki bu yeterlidir.

+0

için takip etmek için hantal olurdu. Herhangi bir aritmetik yok (önce sonucu görebilmek istedim), bu yüzden önce Fred'in önerisini deneyeceğim. Daha sonra her iki yaklaşımın performansını karşılaştırabilirim. – rubenvb