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

时间:2017-06-18 22:32:40

标签: c string windows gcc anagram

晚安,C中最好的方法是计算字符串中 UNIQUE 字谜的可能性数量,最大长度为256,不允许重复由同一个字母引起?输入只是大写,只允许使用字母,A-Z。我陷入了最糟糕的26程序!一个非常大的数字甚至溢出我的双倍。我想我在这里非常迷失,我在C中不太好。该计划只需要显示可能性的数量,而不是anagram。像:

LOL = 3

HOUSE = 120

OLD = 6

ABCDEFGHIJKLMNOPQRSTUVWXYZ = 403291461126605635584000000

非常感谢你们......我尝试过很多次尝试失败但是我遇到了困难。我更接近的方式是在Pascal,但它在一些测试中也失败了,我无论如何都不能使用Pascal。我在Windows上使用CodeBlocks编译GCC。

1 个答案:

答案 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]的数组中。

我会留下你问另一个问题。

相关问题