c - 我查找素数的代码不起作用。这里有什么问题?
问题描述
我试图找到最高 1000 的素数,但我只得到 2 和 3。
void main()
{
int i = 1, j, n = 1000;
while (n != 0)
{
j = 2;
i++;
if (i % j != 0)
{
j++;
}
if (i == j)
{
printf("%d\n", i);
n--;
}
}
}
解决方案
你的代码有问题:
你应该
#include <stdio.h>
的原型
main
不正确,它应该返回int
。您应该在循环外初始化
j
并以稍微不同的顺序运行测试。该代码并非旨在查找最多 1000 的素数,而是查找前 1000 个素数。
这是一个更正的版本:
#include <stdio.h>
// print the first 1000 prime numbers
int main() {
int i = 2, j = 2, n = 1000;
while (n != 0) {
if (i % j == 0) {
if (i == j) {
printf("%d\n", i);
n--;
}
j = 2;
i++;
} else {
j++;
}
}
return 0;
}
但是请注意,您的算法令人困惑且效率低下:
您将真正应该表达为 2 个嵌套循环的内容组合在一个循环中。
你测试所有除数到
i
,而你可以在 时停止j * j > i
,将时间复杂度从O(N 2 )降低到O(N 1.5 )。您也可以在特殊情况下
2
仅测试奇数和除数,从而进一步减少除数的另一个因素。
这是一个替代方案:
#include <stdio.h>
// print the first 1000 prime numbers
int main() {
int i, j, n = 1000;
if (n > 0) {
printf("%d\n", 2);
n--;
}
i = 3;
while (n > 0) {
for (j = 3;; j += 2) {
if (j * j > i) {
printf("%d\n", i);
n--;
break;
}
if (i % j == 0)
break;
}
i += 2;
}
return 0;
}
推荐阅读
- laravel - 获取使用属于页面并具有正确角色的嵌套关系
- python - 通过将用户输入与产品功能递归匹配来创建产品包
- python - 当值在 dtype 对象中时查找总和
- python - 无法在 PyCharm 上安装 Tensorflow:“找不到满足要求 tensorflow 的版本(来自版本:无)”
- r - 根据条件将列的子集复制到 R 中的另一个数据框
- vba - 分号分隔的 UTF8 CSV Excel 使用 VBA 和 sep=;
- mysql - 如何连接到 Maria DB Docker 映像 - 使用 MYSQL Workbench 或 sql developer
- hadoop - 通过 Ansible 启动 Hadoop 的 ResourceManager 无法启动
- python - 从 python 文件在 hydra DictConfig 中创建一个新密钥
- angular - 角材料拖放:赛普拉斯测试不起作用