我的代码中存在一个逻辑缺陷,我似乎无法通过2 ^ 31 - 1作为输入。这是我的代码片段。
#include <stdio.h>
int main() {
long input = 0;
long temp = 0;
int count = 0;
printf("Enter a positive integer ( or 0 to quit): ");
scanf("%ld", &input);
if(input == 0)
{
printf("Quit.");
}
else
{
temp = input;
while (temp != 1)
{
if(temp %2 ==0)
{
temp = temp/2;
count++;
} else
{
temp = 3*temp + 1;
count++;
}
}
return 0;
}
我尝试将输入的大小更改为long =&gt;调试它后,它仍然卡在这个区域内。请提供一些反馈谢谢!
答案 0 :(得分:0)
假设您的系统有64位长,那么将其更改为使用unsigned long
,包括scanf()
,似乎可以正常工作:
#include <stdio.h>
#include <assert.h>
int main() {
unsigned long input;
assert(sizeof(input) * 8 >= 64);
while (1) {
printf("Enter a positive integer (or 0 to quit): ");
(void) scanf("%lu", &input);
if (input == 0) {
break;
}
unsigned int count = 0;
while (input != 1) {
if (input % 2 == 0) {
input /= 2;
} else {
input = 3 * input + 1;
}
count++;
}
printf("%d\n", count);
}
printf("Quit.\n");
return 0;
}
<强> USAGE 强>
> ./a.out
Enter a positive integer (or 0 to quit): 2147483647
450
Enter a positive integer (or 0 to quit): 0
Quit.
>
否则,找一些其他64位类型(long long?)来使用。 Python工作,因为它有无限大的整数。
答案 1 :(得分:0)
long int
不一定必须超过32位。为确保您使用的是64位整数,最好使用int64_t
中的inttypes.h
类型,并在调用中使用PRId64
宏而不是ld
scanf()
。
但是,在任何普通的桌面系统上,你应该至少获得一个32位的int。但问题出在这行代码中:
temp = 3 * temp + 1;
如果输入是2 ^ 31-1,那么这将溢出32位int。