【发布时间】:2021-11-18 19:07:59
【问题描述】:
背景故事(如果有兴趣):
最近,我学会了用二进制写数字。所以,我想看看我是否可以为 32 位编写每一种可能性。所以,我开始了,在成功完成了 10 位之后,我查找了 32 位的解决方案总数。事实证明,这比我想象的要多得多(远远超过 40 亿)。所以我认为一个有趣的挑战是编写一个自定义程序(用 C 语言)来计算 32 位的每一个可能的答案。
为此,我使用了一个包含 32 个项目的数组。然后,我检查第 32 个值是否等于 0。如果是,那么我只需将其更改为 1。如果是 1,我将其更改为 0,然后更改之后的每个项目(等于 1)回到零,直到我打到 0。 这是我的代码:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
int bits[32] = {1, 0};
for (int i=0;i<3000;i++)
{
for (int j=0;i<32;i++)
{
if (bits[32] == 0)
{
bits[32] = 1;
}
else if (bits[32] == 1)
{
int k = 0;
for (k = 0;k<32;k++)
{
int position = 32-k;
while(bits[position] != 0)
{
bits[position] = 0;
}
bits[position+1] = 1;
}
}
}
for (int i=0;i<32;i++)
{
printf("%d", bits[i]);
}
printf("\n");
}
getchar();
return 0;
}
然后我遇到了一个主要障碍。它根本不起作用(只需插入任何 IDE,运行它,您就会自己看到它)。在我看来,这似乎完全合乎逻辑,但显然它不是那样工作的,我承认我完全迷路了。 有谁知道(没有给我整个代码,我仍然想自己做)为什么这不起作用,以及如何解决它? 非常感谢。
【问题讨论】:
-
bits[32]超出范围。您可以通过bits[31]索引bits[0]。同样,int position = 32-k;将在bits[position]中相差一个。 -
C 和 C++ 是两种非常不同的语言,请不要同时标记。仅标记您实际编写程序所用的语言。
-
您应该解释问题所在,而不是让 Stack Overflow 读者编译并运行您的代码,然后再尝试找出问题所在。
-
这样做的方法非常复杂:)。不过,
(int j=0;i<32;i++)不应该是j吗?一个好主意是为for索引使用不同的名称。第二个嵌套的for也使用i,我不认为这是有意的。 -
另外,检查设置 j=0 的循环。结束条件基于“i”,即外部循环变量。