我正在尝试从单词中创建一个词形,其中的答案应该是例如:
“at”这个词应该有两个字谜。
严酷考验应该有5040个字谜。
xiang mu xiang mu xiang mu xiang mu xiang应该有29937600个anagram。
abcdefghijklmnopqrstuvwxyz应该有40329146126656355840000个anagrams。
efghijklmabcdefghijklm应该有49229914688306352000000。
我的程序似乎适用于前三个例子,但不适用于后两个。如何更改程序使其生效?

#include <stdio.h>
#include <memory.h>

int contains(char haystack[], char needle) {
    size_t len = strlen(haystack);
    int i;
    for (i = 0; i < len; i++) {
        if (haystack[i] == needle) {
            return 1;
        }
    }
    return 0;
}

unsigned long long int factorial(unsigned long long int f) {
    if (f == 0)
        return 1;
    return (f * factorial(f - 1));
}

int main(void) {
    char str[1000], ch;
    unsigned long long int i;
    unsigned long long int frequency = 0;
    float answer = 0;
    char visited[1000];
    int indexvisited = 0;
    printf("Enter a string: ");
    scanf("%s", str);
    for (i = 0; str[i] != '\0'; ++i);
    unsigned long long int nominator = 1;
    for (int j = 0; j < i; ++j) {
        ch = str[j];
        frequency = 0;
        if (!contains(visited, ch)) {
            for (int k = 0; str[k] != '\0'; ++k) {
                if (ch == str[k])
                    ++frequency;
            }
            printf("Frequency of %c = %lld\n", ch, frequency);
            visited[indexvisited] = ch;
            visited[++indexvisited] = '\0';
            nominator = nominator * factorial(frequency);
        }
    }
    printf("Number of anagrams = %llu\n", (factorial( i )/nominator ) );
    return 0;

}

最佳答案

尽管unsigned long long相当大,但它并不是完全无限的。其最大值约为1×10×19。如果源字符串长26个字符,则计算factorial(26)-大约为4*10^26,比unsigned long long中的值大得多。

关于c - 如何处理C中的整数溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43919757/

10-12 15:02