2011-01-01 5 views
0

私はCで特別なカウンターを作成しようとしています。#...つまり、カウンターは数字ではなく文字で構成されることを意味します。アプリケーションが正常に動作し、正確な出力を提供しますstrSize < 3場合特別カウンター

char[] str = new char[strSize]; 
int i = 0; 
int tmpSize = strSize - 1; 
int curr; 
while(!isEqual(str,finalStr,strSize)) 
{ 
    str[strSize] = element[i % element.Length]; 
    i++; 
    if (str[strSize] == element[element.Length - 1]) 
    { 
     int j = strSize - 1; 
     if (j > 0) 
     { 
      j--; 
      int tmpCntr = j+1; 
      curr = getCurrentID(str[tmpCntr]); 
      str[tmpCntr] = element[(curr + 1) % element.Length]; 
      while (str[tmpCntr] == element[0] && (i % element.Length > 0) && tmpCntr < 0) 
      { 
       tmpCntr--; 
       curr = getCurrentID(str[tmpCntr]); 
       str[tmpCntr] = element[(curr + 1) % element.Length]; 
      } 
     } 
    } 
} 

は私がサイズ3の char[]持っています。 strSize >= 3の場合、アプリケーションは無限ループに入ります!

ヘルプが必要です。

これがこのように難しい場合は、数値カウンタを作成する方法が必要になります

+1

数値カウンタを使用して、それを表示する必要があるときにテキストに変換してみませんか? 「要素」には何が入っていますか? –

+0

getCurrentIDとは何ですか? –

+0

@Tim Robinson: 'element'には、カウンターとして使用される文字が含まれています。 – sikas

答えて

3

メソッドやパラメータの半分が表示されていません。

個人的には私は別のアプローチを採用します。私はイテレータブロックを使用してIEnumerable<string>を返し、は内部的にの整数カウンタを保持するだけです。次に、カウンタ値と「数字のアルファベット」を文字列に変換するメソッドを記述するだけです。このような何か:intの範囲が十分であれば

public static IEnumerable<string> Counter(string digits, int digitCount) 
{ 
    long max = (long) Math.Pow(digits.Length, digitCount); 
    for (long i = 0; i < max; i++) 
    { 
     yield return ConvertToString(i, digits, digitCount); 
    } 
} 

もう一つの選択肢は、LINQと同じことを行うことです。いずれの場合も

public static IEnumerable<string> Counter(string digits, int digitCount) 
{ 
    int max = (int) Math.Pow(digits.Length, digitCount); 
    return Enumerable.Range(0, max) 
        .Select(i => ConvertToString(i, digits, digitCount)); 
} 

、あなただけ取得するために返されるシーケンスを反復します適切なカウンタ値。場所のものと

は、あなただけの ConvertToStringを実装する必要があります - おそらく、このようなものになると思われる。

using System; 
using System.Collections.Generic; 
using System.Linq; 

class Test 
{ 
    static void Main() 
    { 
     // Show the first 10 values 
     foreach (string value in Counter("ABCD", 3).Take(10)) 
     { 
      Console.WriteLine(value); 
     } 
    } 

    public static IEnumerable<string> Counter(string digits, int digitCount) 
    { 
     long max = (long) Math.Pow(digits.Length, digitCount); 
     for (long i = 0; i < max; i++) 
     { 
      yield return ConvertToString(i, digits, digitCount); 
     } 
    } 

    public static string ConvertToString(long value, 
             string digits, 
             int digitCount) 
    { 
     char[] chars = new char[digitCount]; 
     for (int i = digitCount - 1 ; i >= 0; i--) 
     { 
      chars[i] = digits[(int)(value % digits.Length)]; 
      value = value/digits.Length; 
     } 
     return new string(chars); 
    } 
} 

出力:

ここ
public static string ConvertToString(long value, string digits, int digitCount) 
{ 
    char[] chars = new char[digitCount]; 
    for (int i = digitCount - 1 ; i >= 0; i--) 
    { 
     chars[i] = digits[(int)(value % digits.Length)]; 
     value = value/digits.Length; 
    } 
    return new string(chars); 
} 

はそれをすべての作業を示すテストプログラムです
AAA 
AAB 
AAC 
AAD 
ABA 
ABB 
ABC 
ABD 
ACA 
ACB 
+0

@Jon Skeet: '.Take(10)'は何をするのですか? – sikas

+1

@sikas:入力シーケンスから最初の10個の値だけを返すシーケンスを返します。もしLINQをまだ見ていないのであれば、私は強くお勧めします:) –

+0

OK、すべての可能性を表示するためにそれを削除し、 'string'ではなく' char [] '今すぐ動作しています – sikas

関連する問題