2010-07-28 55 views
5

我的15歲小弟弟正在開始編程,他寫了一個整潔的小程序,輸出六位數或更少的字母和數字的所有組合。他的代碼是一個六重嵌套的for循環,它更新了六級char數組的元素。它看起來很糟糕,但速度肯定快!我向他展示瞭如何做一個簡單的計數,並將這些數字轉換爲基數36.如何在C++中計算不同的數字基數?

最大的問題是我的代碼比他慢很多,因爲我正在做這個部門。有沒有一種方法可以簡單地假定基數爲36,並輸出一個從1到36^6的計數?

理想情況下,我希望做類似

[base 36] 
for(int i = 0; i < 1000000; i++) 
    SaveForLaterFileOutput(i); 
+6

您在演示中混淆了價值。純粹的計數不是一個可以給出基數的概念。重構版本你兄弟的解決方案可能是兩個更好的! – 2010-07-28 18:17:24

+0

語言中沒有內置的base36構造。然而,你不需要分工去做你想做的事。 – driis 2010-07-28 18:17:38

回答

3

試試這個:

char buffer[1024]; 
for(int i = 0; i < 1000000; i++) 
     cout << itoa (i, buffer, 36); 

這是沒有itoa(如果你沒有的話)

cout << setbase (36); 
for(int i = 0; i < 1000000; i++) 
     cout << i << endl; 
cout << setbase (10); // if you intend to keep using cout 

+2

'itoa'不在標準中,並不是所有的C++庫都包含它。 – 2010-07-28 18:23:14

+0

這確實能做到這一點。謝謝。 – Jeffrey 2010-07-28 18:25:27

+0

更新爲無itoa答案(謝謝@Konrad Rudolph) – 2010-07-28 18:32:10

1

轉換一個底數爲36:使蓄能器,並開始從一個足夠高的程度,例如36^6。如果累加器加上該數字小於您的數字,請將其添加到累加器並重復相同的程度(這是數字值),如果更大,則將其丟棄。重複較低的度數,直到達到36^0。跟蹤每個學位的計數,這就是您的基數爲36的數字。

以有意義的方式打印出來,做其他事情。

1

計算中使用的所有的數字都是在基地2你看到的任何其他數字只是對它的印刷方式的幻想。因此你的SaveForLaterOutput是毫無意義的。

庫函數itoa()(即轉換爲「整數爲ASCII」)(現在它已被安全_itoa_s()函數取代)允許您在準備輸出時指定基準。

+0

在二進制中沒有「2」這樣的東西,所以從技術上講,所有的計算都是以10進製表示的二進制數(不要和我們人類非常喜歡的數字相混淆)。 – fredoverflow 2010-07-28 18:48:59

+0

世界上只有10種人:那些懂二進制和不懂的人。 – 2010-07-28 18:55:07

+0

有10種人:那些明白三元組,那些不知道的人和那些把它誤認爲是二元的人;) – 2010-07-28 19:00:59

2

你的兄弟有可能更新他的6元素陣列而不需要6個嵌套循環。通過修改下面的increment功能,你可以在任何「基地」算你選擇:

#include <algorithm> 
#include <iostream> 

#define NUM_CHARS 6 

// assuming ASCII 
// advances through a chosen sequence 0 .. 9, a .. z 
// or returns -1 on overflow 
char increment(char &c) { 
    if (c == 'z') return -1; 
    if (c == '9') { c = 'a'; return c; } 
    return ++c; 
} 

int main() { 
    char source[NUM_CHARS+1] = {0}; 
    std::fill_n(&source[0], NUM_CHARS, '0'); 
    while (true) { 
     std::cout << source << "\n"; 
     int idx = NUM_CHARS; 
     // increment and test for overflow 
     while (increment(source[--idx]) == -1) { 
      // overflow occurred: carry the 1 
      source[idx] = '0'; 
      if (idx == 0) return 0; 
     } 
    } 
} 

我沒有打擾的問題的「或更少」的一部分:但是你已經有6個環,做到了可能也會使用這種技術。嚴格來說,這是枚舉組合,這與計算幾乎不一樣。