我正在尝试从单词中创建一个词形,其中的答案应该是例如:
“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/