从 3 到 100 的数组打印质数
printing prime numbers from an array of 3 to 100
我不知道如何修复此代码以使其正常工作:
int Numbers_Given[97];
int n;
for (n = 3; n <= 100; ++n) {
Numbers_Given[n - 3] = n;
// printf("%d ", Numbers_Given[n - 3]);
}
int i;
for (n = 0; n < 97; n++) {
for (i = 2; i < Numbers_Given[i - 2]; i++) {
if (Numbers_Given[i - 2] % i == 0)
break;
else (printf("%d ", Numbers_Given[i - 2]));
}
}
return 0;
}
好像只是没理解%
。这是怎么回事?它一遍又一遍地打印出从 3
到 100
的原始数组。质数没有打印出来。
存在多个问题。
你的数组太小
您使用 i-2
作为索引,而您应该使用 n
您在检查所有 %
值之前正在打印。
试试这个:
int main()
{
int Numbers_Given[98]; // because highest index is 100-3 = 97
int n;
for (n=3;n<=100;++n)
{
Numbers_Given[n-3]=n;
}
int i;
for (n=0;n<=97;n++)
{
int prime = 1; // Assume that Numbers_Given[n] is a prime
for(i=2;i<Numbers_Given[n];i++) // use Numbers_Given[n]
{
if (Numbers_Given[n]%i==0)
{
prime = 0; // Not a prime so clear the flag
break;
}
}
if (prime) (printf("%d ", Numbers_Given[n])); // Print if it's a prime
}
return 0;
}
顺便说一句:检查余数 (%
) 时,您正在测试从 2
到 Numbers_Given[n] - 1
的所有数字。你不需要那个,你可以早点停止(即sqrt(Numbers_Given[n])
)
第一个问题,正如@user3386109 指出的那样,你应该使用 n<100
而不是 n<=100
因为 Number_Given[97]
是数组本身所以最后一次迭代过去了它没有' 对输出有任何影响,但避免使用这是未来代码的一个好习惯。
这里的问题是,在内部循环中,您似乎 运行 它带有条件 i<Numbers_Given[i-2]
但问题是当您使用 [=18= 增加 i
的值时] Number_given[i-2]
的值发生变化,因此它永远不会到达终点。假设我们进行第一次迭代 i=2
然后在第一次迭代后 i++
将其更改为 i=3
但现在 Number_given[i-2]
被称为 Number_given[1]
即 4
所以仍然 i<4
和条件遵循 所以循环 运行s 然后下一个循环 i=4
但然后 Numbers_Given[i-2]
将是 Numbers_Given[2] = 5
所以它满足条件 i<5
再一次。每个循环都一样。所以你一遍又一遍地得到数字范围。
为了解决这个从 Numbers_Given[i-2]
到 Numbers_Given[n]
的变化,在 i
增量之后,n
独立于它,因此不会改变值并且严格条件。
此外,即使在将 Numbers_Given[i-2]
替换为 Numbers_Given[n]
之后,问题是在未能遵循“if (Numbers_Given[n]%i==0)”语句之后,else 运行s 并输出数字,但它将继续为 i
的每个值执行此操作,因此输出看起来像
3 5 5 5 7 7 7 7 7 9 11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 15 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 21 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 25 25 27 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 49 49 49 49 49 51 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 55 55 55 57 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 63 65 65 65 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 69 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 75 77 77 77 77 77 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 81 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 85 85 85 87 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 91 91 91 91 91 93 95 95 95 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 99
所以为了解决这个问题,我们只需 break
我们的循环,只要它到达 else
语句,这意味着我们在第一次得到它时就得到素数,然后不再检查它。
因此最终代码将如下所示,输出 3 到 100 数组中的所有质数。
#include <stdio.h>
#include <stdbool.h>
int main()
{
int Numbers_Given[98];
int n;
for (n=3;n<=100;++n)
{
Numbers_Given[n-3]=n;
// printf("%d ", Numbers_Given[n-3]);
}
int i;
for (n=0;n<97;n++)
{
bool flag = 1;
for(i=2;i<Numbers_Given[n];i++){
if (Numbers_Given[n]%i==0){
flag = 0;
break;
}
}
if (flag) {
printf("%d ", Numbers_Given[n]);
}
}
return 0;
}
其输出:
3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
P.S:- 正如其他人所说,用完整的信息提问,比如你期望什么,而不是出现什么,你得到的错误代码(如果有的话)等等,最后编辑问题以使其更容易人们来解释。
还有一点 2 也是素数,:) 只是一个附带信息。
我不知道如何修复此代码以使其正常工作:
int Numbers_Given[97];
int n;
for (n = 3; n <= 100; ++n) {
Numbers_Given[n - 3] = n;
// printf("%d ", Numbers_Given[n - 3]);
}
int i;
for (n = 0; n < 97; n++) {
for (i = 2; i < Numbers_Given[i - 2]; i++) {
if (Numbers_Given[i - 2] % i == 0)
break;
else (printf("%d ", Numbers_Given[i - 2]));
}
}
return 0;
}
好像只是没理解%
。这是怎么回事?它一遍又一遍地打印出从 3
到 100
的原始数组。质数没有打印出来。
存在多个问题。
你的数组太小
您使用
i-2
作为索引,而您应该使用n
您在检查所有
%
值之前正在打印。
试试这个:
int main()
{
int Numbers_Given[98]; // because highest index is 100-3 = 97
int n;
for (n=3;n<=100;++n)
{
Numbers_Given[n-3]=n;
}
int i;
for (n=0;n<=97;n++)
{
int prime = 1; // Assume that Numbers_Given[n] is a prime
for(i=2;i<Numbers_Given[n];i++) // use Numbers_Given[n]
{
if (Numbers_Given[n]%i==0)
{
prime = 0; // Not a prime so clear the flag
break;
}
}
if (prime) (printf("%d ", Numbers_Given[n])); // Print if it's a prime
}
return 0;
}
顺便说一句:检查余数 (%
) 时,您正在测试从 2
到 Numbers_Given[n] - 1
的所有数字。你不需要那个,你可以早点停止(即sqrt(Numbers_Given[n])
)
第一个问题,正如@user3386109 指出的那样,你应该使用 n<100
而不是 n<=100
因为 Number_Given[97]
是数组本身所以最后一次迭代过去了它没有' 对输出有任何影响,但避免使用这是未来代码的一个好习惯。
这里的问题是,在内部循环中,您似乎 运行 它带有条件 i<Numbers_Given[i-2]
但问题是当您使用 [=18= 增加 i
的值时] Number_given[i-2]
的值发生变化,因此它永远不会到达终点。假设我们进行第一次迭代 i=2
然后在第一次迭代后 i++
将其更改为 i=3
但现在 Number_given[i-2]
被称为 Number_given[1]
即 4
所以仍然 i<4
和条件遵循 所以循环 运行s 然后下一个循环 i=4
但然后 Numbers_Given[i-2]
将是 Numbers_Given[2] = 5
所以它满足条件 i<5
再一次。每个循环都一样。所以你一遍又一遍地得到数字范围。
为了解决这个从 Numbers_Given[i-2]
到 Numbers_Given[n]
的变化,在 i
增量之后,n
独立于它,因此不会改变值并且严格条件。
此外,即使在将 Numbers_Given[i-2]
替换为 Numbers_Given[n]
之后,问题是在未能遵循“if (Numbers_Given[n]%i==0)”语句之后,else 运行s 并输出数字,但它将继续为 i
的每个值执行此操作,因此输出看起来像
3 5 5 5 7 7 7 7 7 9 11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 15 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 21 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 25 25 27 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 49 49 49 49 49 51 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 55 55 55 57 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 63 65 65 65 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 69 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 75 77 77 77 77 77 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 81 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 85 85 85 87 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 91 91 91 91 91 93 95 95 95 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 99
所以为了解决这个问题,我们只需 break
我们的循环,只要它到达 else
语句,这意味着我们在第一次得到它时就得到素数,然后不再检查它。
因此最终代码将如下所示,输出 3 到 100 数组中的所有质数。
#include <stdio.h>
#include <stdbool.h>
int main()
{
int Numbers_Given[98];
int n;
for (n=3;n<=100;++n)
{
Numbers_Given[n-3]=n;
// printf("%d ", Numbers_Given[n-3]);
}
int i;
for (n=0;n<97;n++)
{
bool flag = 1;
for(i=2;i<Numbers_Given[n];i++){
if (Numbers_Given[n]%i==0){
flag = 0;
break;
}
}
if (flag) {
printf("%d ", Numbers_Given[n]);
}
}
return 0;
}
其输出:
3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
P.S:- 正如其他人所说,用完整的信息提问,比如你期望什么,而不是出现什么,你得到的错误代码(如果有的话)等等,最后编辑问题以使其更容易人们来解释。
还有一点 2 也是素数,:) 只是一个附带信息。