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

C - Count the number of combinations possible in a string without repetitions

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

哈哈=3

房子 = 120

老 = 6

A​​BCDEFGHIJKLMNOPQRSTUVWXYZ = 403291461126605635584000000

非常感谢你们...我尝试了很多但每次都失败了,我很苦恼。我更接近它的方式是在 Pascal 中,但它在一些测试中也失败了,而且我无论如何也不能使用 Pascal。我在使用 GCC 编译的 Windows 上使用 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].

的数组中

我会留给你再问一个问题。