查找随机文本的所有大写字母组合

时间:2015-05-22 19:43:05

标签: c combinations generated

在C中,我有一个字符数组,随机数字和字母没有大写字母。我需要弄清楚如何生成包含大写字母的所有可能组合,同时保留数字完整但我甚至不确定从哪里开始。 (例如,abc123,Abc123,aBc123,abC123,ABc123,AbC123,aBC123,ABC123)

2 个答案:

答案 0 :(得分:2)

确实会有2 ^ n种可能性,n表示你的char数组中的字母字符数量。

为了解决您的问题,我建议您查看recursion,我想这是实现您想要做的最简单的方法,您只需要考虑与平常不同的方式。

编辑:这是一些实现

void enumerate(char *str, int n)
{
  printf("%s\n", str); // Print one solution
  while (++n < strlen(str)) // Loop while you don't reach the end
    if (str[n] > 96 && str[n] < 123) // Check if str[n] is alphabetic
      {
        char *tmp = calloc(strlen(str) + 1, sizeof(char));
        strcpy(tmp, str); // Create a copy of the initial string
        tmp[n] -= 32; // Put tmp[n] = str[n] in uppercase
        enumerate(tmp, n); // Call recursion with new string and current position
      }
}

你称之为

enumerate("abc123", -1);

结果

abc123
Abc123
ABc123
ABC123
AbC123
aBc123
aBC123
abC123

答案 1 :(得分:1)

目前,无视数字。

说你现在有x个字符。如果x = 3(假设),则考虑从0到7的数字,因为2 ^ 3 - 1是7(-1因为你必须将0视为一个状态)。

然后你必须迭代所有数字,并在其位为1时大写一个字母。

示例:

  • abc - 000(0)
  • abC - 001(1)
  • aBc - 010(2)
  • aBC - 011(3)
  • Abc - 100(4)

这里有代码,适合那些无法理解理论的人。

void enumerate (String input) {

    int count = 0;
    //count the number of non-digit characters
    for(int i=0; i<input.length(); i++)
        if(!Character.isDigit(input.charAt(i))) {
            count++;
        }

   count =(int) Math.pow(2,count); 
   //printing all the combinations.
   int i=0, digit=0;
   while(count--> 0) {
       String output = ""; 
       for(int j=input.length()-1; j>=0; j--) {
           char c = input.charAt(j);   
           if(Character.isDigit(c))
               output = (char)c + output;
           else {
               output = (char) (((i&1) == 1)? c-32 : c) + output;
               i = i>>1;
           }
       }
       System.out.println(output);
       i = ++digit;

   }
}