【问题标题】:Finding all possible words from inputted phone number [duplicate]从输入的电话号码中查找所有可能的单词[重复]
【发布时间】:2013-04-13 12:02:34
【问题描述】:

我有一个问题需要帮助解决。我希望我能得到一些关于更好的方法来处理我正在做的事情的指示。我的主要问题是下面几行(//这让我感到困惑)并在页面底部进行了描述。

我需要排列电话号码的所有可能结果:(不仅仅是字典单词)

I.E. 222-2222

应该输出一个 3^7 长的列表,其中包含 a、b、c 的所有可能排列

I.E.

AAAAAAA
AAAAAAB
AAAAAAC
AAAAABA   // THIS IS WHATS HANGING ME UP
AAAAABB
AAAAABC
AAAAACA   // HERE TOO AND SO ON

我的代码(专门为测试而缩短)给我:

AAAA
AAAB
AAAC
AABC
AACC
ABCC
ACCC
BCCC
CCCC

我是一名开始编程的学生,所以我的知识涉及使用 for、while、if 语句以及从数组中获取单个字符。

到目前为止,我的代码如下所示:(这是函数的一部分。缺少代码)

char alphaFunc(char n[]){

int d1=n[0]-48;
int d2=n[1]-48;
int d3=n[2]-48;
int d4=n[3]-48;
int d5=n[4]-48;
int d6=n[5]-48;
int d7=n[6]-48;
int a=0,b=0,c=0,d=0,e=0,f=0,g=0;

int i=0;

char charArray[10][4]={ {'0','0','0'},{'1','1','1'},{'A','B','C'},
        {'D','E','F'},{'G','H','I'},{'J','K','L'},{'M','N','O'},
        {'P','R','S'},{'T','U','V'},{'W','X','Y'}  };



while(i <=14){

    printf("%c%c%c%c\n", charArray[d1][a],
            charArray[d2][b],charArray[d3][c],charArray[d4][d],
            charArray[d5][e],charArray[d6][f],charArray[d7][g]);
    g++;

    if(g==3){
        g=2;
        f++;
    }
    if(f==3){
        f=2;
        e++;
    }
    if(e==3){
        e=2;
        d++;
    }

我并不是在找人来帮我做这件事[3] 并将其重置为 [0] 它会将您发送到循环的不同部分。 (希望这是有道理的)。

【问题讨论】:

  • 如果那是重复的......它并没有帮助我解决我想要的问题。 :(
  • 我提供的链接显示了如何从列表中生成项目组合(您要求“指向更好方法的指针”,我发布了两个链接)。您可以通过使用调试器单步执行代码来找到您遇到的代码问题。在您有疑问的行上设置一个断点,运行调试,直到您在断点处停止,然后单步执行代码,观察变量以查看它们发生了什么。 (如果您也使用更易读的变量名,这会对您有所帮助。)
  • 感谢您的帮助。我更多的是寻找一个关于我需要使用什么类型的循环的快速提示(for,while,if..),因为这是一个在线课程,比开始编程高出一步,我不知道如何使用调试器 b/c 我们登录到 linux 服务器。
  • 我使用 gdb 进行了一些汇编编程。我使用的地方: as -gstabs -o file1.o file1.s 然后 ld -o ... ...
  • 如果您是初学者,这样做的方法是制作嵌套循环。你会将它们嵌套七层。每个循环都会遍历与每个数字相关的可能字母。

标签: c


【解决方案1】:

由于charArray 的值是常量,我建议将其设为全局变量,而不是在函数中声明它。此外,由于有些数字有 4 个字母,而另一些有 3 个字母,您可能需要考虑使用 jagged array 来表示它。

就打印您可以从电话号码获得的排列而言,我认为递归将成为您的朋友。假设您可以将电话号码存储在一个 int 数组中,以下应该可以工作:

public void printPermutations(int[] phoneNumber)
{
   printPermutations(phoneNumber, 0, String.Empty);
}

private void printPermutations(int[] phoneNumber, int index, string permutation)
{
   if(index >= phoneNumber.Length)
   {
       // If we've reached the end, print the number
       printf(permutation + "\n");
   }
   else
   {
       // Otherwise, generate a permutation for each
       // character this digit can be
       int digit = phoneNumber[index];
       char[] chars = charArray[digit];
       for (int i = 0; i < chars.Length; i++)
       {
           printPermutations(phoneNumber, index+1, permutation + chars[i]);
       }
   }
}

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多