Неверный вывод данных при создании списка слов - PullRequest
0 голосов
/ 19 сентября 2011

Мне нужен был код для генерации списка слов из заранее заданного набора символов, начиная с определенной позиции, чтобы я мог остановиться, а затем продолжить позже. Мой код не так хорош, поэтому я был бы очень признателен за любую помощь в исправлении его или советы по его ускорению / повышению эффективности или любые комментарии.

Вот токовый выход:

Data = aaa
Data = aab
Data = aac
Data = aba
Data = abb
Data = abc
Data = aca
Data = acb
Data = acc
Data = a
Data = a
Data = a
Data = baa
Data = bab
Data = bac
Data = bba
Data = bbb
Data = bbc
Data = bca
Data = bcb
Data = bcc
Data = b
Data = b
Data = b
Data = caa
Data = cab
Data = cac
Data = cba
Data = cbb
Data = cbc
Data = cca
Data = ccb
Data = ccc
Data = c
Data = c
Data = c

вывод должен быть (я думаю)

Data = aaa
Data = aab
Data = aac
Data = aba
Data = abb
Data = abc
Data = aca
Data = acb
Data = acc
Data = baa
Data = bab
Data = bac
Data = bba
Data = bbb
Data = bbc
Data = bca
Data = bcb
Data = bcc
Data = caa
Data = cab
Data = cac
Data = cba
Data = cbb
Data = cbc
Data = cca
Data = ccb
Data = ccc

, которые представляют собой все возможные комбинации набора символов из 3 букв и комбинации из 3 букв

и вот мой код c

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>

char *charset = "abc";
int len = 3;
char *str;

int CharPos(char c)
{
    int i;
    for (i = 0; i < len; i++)
    {
        if (charset[i] == c) break;
    }
    if (i == strlen(charset)) i = 0;
    return i;
}

void generate(int pos)
{
    while(str[0] != 0)
    {
        bool zero = false;
        int y = 0;
        while (str[len - 1] != 0)
        {
            printf("Data = %s\n", str);
            str[len - 1] = charset[++y];
            if (zero)
            {
                zero = false;
                break;
            }
            Sleep(100);
        }

        int x = len;
        while (x)
        {

            x--; // x = 1
            if (str[x] != 0)
            {
                int charpos = CharPos(str[x]); // str[x] = a, charpos = 0
                str[x] = charset[++charpos]; //aba
                if (str[x] == 0) zero = true;
                break;
            }
            else
            {
                str[x] = charset[0];
            }
        }
        str[len - 1] = charset[0];
    }
    return;
}

int main()
{
    str = malloc(len);
    strcpy(str, "aaa");
    generate(len - 1);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

Итак, вам нужны все возможные комбинации данной строки.

Итак, я взглянул на это, записал последовательность, которую вы хотели, с точки зрения индексов в данной строке:

"abc"

aaa = 000
aab = 001
aac = 002
aba = 010
abb = 011
abc = 012
aca = 020
acb = 021
acc = 022
baa = 100
... and so forth.

Это в основном считается от 0 до некоторого числа в некоторой базе. Число возможных комбинаций здесь равно 3 ^ 3, поэтому в основном вы рассчитываете до 27 в базе 3. В общем: пусть x будет длиной данной строки. Затем мы считаем от 0 до x ^ x в базе x.

Затем вы можете использовать числовое представление в базе x, чтобы найти n-ю комбинацию.

Я написал быстрое решение в Java:

static void combinations(String str) {
    int base = str.length();
    int combinations = (int) Math.pow(base, base);

    for (int i = 0; i < combinations; i++) {
        int c = i;
        char[] arr = new char[base];
        for (int j = arr.length-1; j >= 0; j--) {
            arr[j] = str.charAt(c % base);
            c /= base;
        }
        System.out.println(Arrays.toString(arr));
    }
}

комбинаций («abc») дает мне:

aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
...

Вот возможное решение в C (впервые используя C):

#include <stdio.h>
#include <string.h>
#include <math.h>

int
main() {
    char *str = "abc";
    int len = strlen(str);
    int combinations = len;
    int j = 1;
    while (j++ < len) {
            combinations = combinations*len;
    }

    int i;
    for(i = 0; i < combinations;i++) {
            char arr[len];
            int c = i;
            int j;
            for (j = len-1; j >= 0;j--) {
                    arr[j] = str[c % len];
                    c /= len;
            }
            printf("%s\n", arr);
    }
    return 0;
}
0 голосов
/ 19 сентября 2011

Вы можете использовать это:

#include <stdio.h>
#include <string.h>

int main(void){
        char  str[] = "aaa";
        int    len = strlen(str);
        int idx = 0;

        while(idx < len){
                while(str[idx] <= 'c') {
                        printf("%s\n",str);
                        str[idx]++;
                }
                str[idx] = 'a';
                while(++idx<len) {
                        str[idx]++;
                        if(str[idx] <= 'c') {
                                idx = 0;
                        break;
                }
                str[idx] = 'a';
                }
          }
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...