我正在创建一个程序来打印数组中的所有素数。 所以,一切正常,除了if语句跳过小于2的数字,显然不是素数。 这是代码:
int main()
{
int a[10], i, prime = 0, c = 0;
printf("Enter 10 numbers:\n");
for( i = 0; i < 10; i++)
{
scanf(" %d", &a[i]);
}
printf("Prime numbers are:");
for(i = 0; i < 10; i++)
{
prime = 1;
for(c = 2; c < a[i]; c++)
{
if(a[i] < 2)
{
prime = 0;
break;
}
if(a[i] % c == 0)
{
prime = 0;
break;
}
}
if(prime == 1)
printf("%d, ",a[i]);
}
}
这里,声明:
if(a[i] < 2)
{
prime = 0;
break;
}
不起作用。
我还在if块中添加了一个printf语句,但它没有被执行。 问题的原因是什么以及如何解决?
答案 0 :(得分:3)
对于根据C标准的初学者,没有参数的函数main应声明为
int main( void )
使用命名常量而不是幻数更好。因此,至少需要引入像
这样的常数#define N 10
并在任何地方使用它而不是数字10。
数组应该有unsigned int
类型,因为素数属于自然数。
由于for循环中的条件
for(c = 2; c < a[i]; c++)
^^^^^^^^
循环体a[i]
内部的总是大于2.所以这个if语句
if(a[i] < 2)
没有意义。
您可以减少内循环的迭代次数。
程序可以按以下方式查看
#include <stdio.h>
#define N 10
int main( void )
{
unsigned int a[N];
printf("Enter %zu numbers: ", ( size_t )N);
for (size_t i = 0; i < N; i++)
{
scanf("%u", &a[i]);
}
printf("Prime numbers are: ");
for (size_t i = 0; i < N; i++)
{
int prime = a[i] == 2 || a[i] % 2 == 1 && a[i] != 1;
for (unsigned int j = 3; prime && j <= a[i] / j; j += 2)
{
prime = a[i] % j != 0;
}
if (prime) printf("%u, ", a[i]);
}
putchar('\n');
return 0;
}
它的输出可能看起来像
Enter 10 numbers: 0 1 2 3 4 5 6 7 8 9
Prime numbers are: 2, 3, 5, 7,
答案 1 :(得分:2)
你永远不会进入for循环
for(c = 2; c < a[i]; c++)
如果a [i] = 1和[i] = 2的值和你的内部if循环
if(a[i] < 2)
正在检查小于2的值,因此您无法进入if循环
答案 2 :(得分:1)
经过一些更改后的代码 -
要检查素数,您无需前往a[i] -1
。您可以检查截至平方根a[i]
的任何数字是否可以整除。这是为了提高效率,否则你的方法也是正确的。
int main()
{
int a[10], i, prime = 0, c = 0;
printf("Enter 10 numbers:\n");
for( i = 0; i < 10; i++)
{
scanf(" %d", &a[i]);
}
printf("Prime numbers are:");
for(i = 0; i < 10; i++)
{
if(a[i]<2)
continue;
prime = 1;
for(c = 2; c*c <= a[i]; c++)
{
if(a[i] % c == 0)
{
prime = 0;
break;
}
}
if(prime == 1)
printf("%d, ",a[i]);
}
}
有关检查素性的其他方法,您可以访问以下链接 -
答案 3 :(得分:1)
主要问题是当内循环退出时输出打印,因为该值小于2.
以下是代码的一个版本:
现在是代码
#include <stdio.h> // printf(), scanf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
#define ARRAY_LEN 10
int main( void )
{
int a[ ARRAY_LEN ];
int prime = 0;
printf("Enter 10 numbers:\n");
for( int i = 0; i < ARRAY_LEN; i++)
{
if( 1 != scanf(" %d", &a[i]) )
{
perror( "scanf failed" );
exit ( EXIT_FAILURE );
}
}
printf("Prime numbers are: ");
for( int i = 0; i < ARRAY_LEN; i++)
{
prime = 1;
if(a[i] < 2)
{
prime = 0;
}
else
{
for( int c = 2; c < a[i]; c++)
{
if(a[i] % c == 0)
{
prime = 0;
break;
}
}
}
if(prime == 1)
printf("%d, ",a[i]);
}
puts( "" );
} // end function: main
以下是我使用的输入和代码运行的输出:
Enter 10 numbers:
0 1 2 3 4 5 6 7 8 9
Prime numbers are: 2, 3, 5, 7,