2011-01-28 4 views
0
const int SIZE = 3; 
const char val[SIZE] = {'3', 'z', '7'}; 

const string& next(){ 
    static string ret = "0"; 
    static unsigned i = 0; 
    static unsigned j = 0; 
    s[j] = val[i]; 
    i++; 

    return ret; 

//... 
} 

毎回が次に呼び出され、私はそれが次の文字列のキーを返したい生成:C++のような、次のキー

3 
z 
7 
33 
3z 
37 
z3 
zz 
z7 
73 
7z 
77 
333 
33z 
... 

valが[]任意の値を使用して任意のサイズである可能性があります。私の実装は間違っていて、不完全で、私はそれの周りに私の頭を包むことはできません。誰も助けることができますか?

答えて

0

あなたの頭を包み込む点では、数字を増やすように考えることができます。一番右の値をインクリメントしますが、それが最後を過ぎたら最初の値に戻して次の列などを増やし、必要に応じて余分な値を前面に追加します。

#include <iostream> 
#include <string> 

const int n = 3; 
const char val[n] = {'3', 'z', '7'}; 

const std::string& next() 
{ 
    static std::string ret; 
    if (ret.empty()) return ret = val[0]; 
    for (int i = ret.length() - 1; i >= 0; --i) 
     if (ret[i] == val[n - 1]) 
     { 
      // carry situation, reset this column & will increment next... 
      ret[i] = val[0]; 
     } 
     else 
     { 
      // found existing column with room to increment... 
      ret[i] = strchr(val, ret[i])[1]; 
      return ret; 
     } 

    return ret = val[0] + ret; // add an extra column at left... 
} 

int main() 
{ 
    for (int i = 0; i < 20; ++i) 
     std::cout << next() << ' '; 
    std::cout << '\n'; 
} 
1
const string& next(){ 
    static int pos = 1; 
    static string s; 
    s.clear(); 
    int n = pos++; 
    while (n){ 
     s += val[(n-1) % SIZE]; 
     // use s = val[(n-1] % SIZE] + s; for inverse order. 
     n = (n-1)/SIZE; 
    }; 
    return s; 
}; 
+0

これは非常に簡単で機能します(後方を除く)。私は理由を理解できません。 – kynnysmatto

+0

@kynnysmatto:アップデートを確認してください。 – ruslik

+0

'string'は' char'からのコンストラクタを持っていませんが、とにかく 'val [(n-1)%SIZE] + s'のものは必要ありません。 –

0

あなたの数字のために異例のシンボルで、ベース3に番号をフォーマットします。 itoaを使用して基数3に変換し、0から3,1からz、2から7を変更して文字列を変更することができます。

+0

私はそれについても考えましたが、それを慎重に見れば、事実ではありません。 – kynnysmatto

+0

ちょうどkynnysmattoのコメントを説明する:基数3で数えるとき、 "00"の値を持たずに2から10になる。 val [0]が一番左側の列にあるはずの値はスキップされます。 –

関連する問題