晚安,C中最好的方法是计算字符串中 UNIQUE 字谜的可能性数量,最大长度为256,不允许重复由同一个字母引起?输入只是大写,只允许使用字母,A-Z。我陷入了最糟糕的26程序!一个非常大的数字甚至溢出我的双倍。我想我在这里非常迷失,我在C中不太好。该计划只需要显示可能性的数量,而不是anagram。像:
LOL = 3
HOUSE = 120
OLD = 6
ABCDEFGHIJKLMNOPQRSTUVWXYZ = 403291461126605635584000000
非常感谢你们......我尝试过很多次尝试失败但是我遇到了困难。我更接近的方式是在Pascal,但它在一些测试中也失败了,我无论如何都不能使用Pascal。我在Windows上使用CodeBlocks编译GCC。
答案 0 :(得分:1)
你应该计算给定字符串长度的阶乘除以每个字母出现的阶乘。
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);
}
注意!
这里有几个人说的是,即使在64位整数中也不能存储26的阶乘。
因此,我将计算更改为阶乘数的对数并将其存储在long double中,我希望它足够精确(我认为exp()函数不够精确)
然而,你不能将此结果用作整数值,除非你找到一种方法将它存储在128位整数或更大的... 如果这符合您的问题,您也应该进行测试。
通过存储0的结果,有一种更快的方法来计算此问题的阶乘!高达26!在一个大小为[27]的数组中。
我会留下你问另一个问题。