C - 计算字符串中可能的不重复组合的数量

标签 c string windows gcc anagram

晚安,C 中计算最大长度为 256 的字符串中 UNIQUE 字谜词的可能性数量且不允许由相同字母引起重复的最佳方法是什么?输入只能是大写字母,并且只允许使用字母 A-Z。我陷入了程序中最坏的情况——26!一个非常大的数字,甚至超出了我的两倍。我想我在这里很迷茫,我在 C 方面不太擅长。程序只需要显示可能性的数量,而不是字谜。喜欢:

哈哈=3

房子= 120

旧 = 6

ABCDEFGHIJKLMNOPQRSTUVWXYZ = 403291461126605635584000000

非常感谢你们...我尝试了很多,但每次都失败了,我对此感到苦恼。我更接近做到这一点的方法是在 Pascal 中,但它在一些测试中也失败了,而且我无论如何也不能使用 Pascal。我在 Windows 上使用使用 GCC 编译的 CodeBlocks。

最佳答案

您应该计算给定字符串的长度除以每个字母出现次数的阶乘。

long double logFactorial (int i) {
    return i < 2 ? 0.L : (logFactorial (i-1)+log(long double (i));
}
int countLetter(const char* str, char c) {
    int res = 0;
    while (str && *str) {
        res += *str++ == c;
    }
    return res;
}
long double numPermutations(const char* str) {
    auto res = logFactorial (strlen(str));
    for (char c = 'A'; c<='Z'; c++) {
        res -= logFactorial (countLetter (str,c));
    }
    return exp((long double)res);
}

注意!

这里有几个人说 26 的阶乘即使在 64 位整数中也无法存储,这是正确的。

因此,我将计算更改为阶乘数的对数并将其存储在 long double 中,我希望它足够精确(我认为 exp() 函数不够精确)

尽管如此,您不能将此结果用作整数值,除非您找到一种方法将其存储为 128 位或更大的整数... 如果这适合您的问题,您也应该测试它。

有一种更快的方法可以通过存储 0 的结果来计算此问题的阶乘!最多26个!在大小为 [27] 的数组中。

我将留给您提出另一个问题。

关于C - 计算字符串中可能的不重复组合的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44620161/

相关文章:

arrays - 返回数组中字符串的长度

java - 无法从文本微调器 getSelectedItem()

c# - ffmpeg 输出管道到命名的 Windows 管道

c - C中的只读字符串

c - 为什么在printf中指定为整数的char被正确打印

c++ - cscope:如何使用 cscope 通过命令行搜索符号?

windows - 在文件中查找和替换的好工具?

不能声明一个 size=var 的字符串,即使 var 是 const

c++ - 货币面额

R:列表中的快速哈希搜索(环境)