C 生成单词列表时错误的数据输出
我需要代码从一个预先指定的字符集生成一个单词列表,并从一个特定的位置开始,这样我就可以停止,然后再继续。我的代码不是很好,所以我真的非常感谢任何帮助修复它或提示使它更快/更有效或任何评论 以下是电流输出:C 生成单词列表时错误的数据输出,c,algorithm,C,Algorithm,我需要代码从一个预先指定的字符集生成一个单词列表,并从一个特定的位置开始,这样我就可以停止,然后再继续。我的代码不是很好,所以我真的非常感谢任何帮助修复它或提示使它更快/更有效或任何评论 以下是电流输出: 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 = 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
输出应该是(我猜)
这是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;
}
#包括
#包括
#包括
#包括
char*charset=“abc”;
int len=3;
char*str;
int CharPos(字符c)
{
int i;
对于(i=0;i
您可以使用以下功能:
#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;
}
#包括
#包括
内部主(空){
字符str[]=“aaa”;
int len=strlen(str);
int-idx=0;
while(idx while(str[idx]所以您想要的是给定字符串的所有可能组合
所以我看了一下,在给定的字符串中写下你想要的索引顺序:
"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,所以在基数3中基本上是从27开始计数。更一般地说:让x是给定字符串的长度。然后我们在基数x中从0到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));
}
}
这里有一个可能的C语言解决方案(首次使用C):
#包括
#包括
#包括
int
main(){
char*str=“abc”;
int len=strlen(str);
int组合=len;
int j=1;
while(j++=0;j--){
arr[j]=str[c%len];
c/=len;
}
printf(“%s\n”,arr);
}
返回0;
}
也许吧?它不起作用,所以我不能在那里发布你不能strcpy
3个字符和空终止符到一个能够容纳3个字节的对象!strcpy(str,“aaa”);
无效,除非你用egstr=malloc(len+1)分配更多空间
我想这不是Java的答案,请具体一点!好吧。这也在算法中发布。我解释了算法,并添加了Java解决方案作为示例。是的,但是如果所需的字符是整个字母表呢?甚至两次“A…Za…z”还有可能是符号太多了我肯定你不能在int或uu int64killercode上保存这个数字-你打算存储所有A-Za-z的组合吗?让我们假设你每个字符使用1个字节。每个组合有52个字符,所以每个组合有52个字节。有52^52个可能的组合。这是1.70676555*10^89。这就是17亿倍于可观测宇宙中的原子数。乘以52,你就得到了所需的字节数。作为比较:1GB是10^9字节。是吗?是的,我只会使用移位:D和++:D。汉克斯,它工作得很好。但是字符集是让我发疯的部分之一
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));
}
}
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
...
#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;
}