我已经编写了以下程序来检查给定的数字是否为素数。但不知何故,程序给出5的倍数,如15,25作为素数。虫子在哪里?
#include <stdio.h>
int main() {
int number, i;
printf("Enter the number to be checked\n");
scanf("%d", &number);
for (i = 2; i < number / 2; i++) {
if (number % i == 0) {
printf("The given number %d is not a prime number \n", number);
break;
} else {
printf("The given number %d is a prime number \n", number);
break;
}
}
return 0;
}
答案 0 :(得分:1)
你应该使用一个标志来知道它何时是一个素数(或者它会在测试一个不是number
的除数的单个数字时就会中断
bool isPrime = true;
for(i=2;i<number/2;i++){
if(number%i==0)
{
isPrime = false;
break;
}
}
if (isPrime){
printf("The given number %d is a prime number \n",number);
}
else {
printf("The given number %d is not a prime number \n",number);
}
答案 1 :(得分:0)
从else
移除for
部分,并将这些行放在循环之后
if( i == number/2)
printf("The given number %d is a prime number \n",number);
答案 2 :(得分:0)
此代码存在很多问题
#include<stdio.h>
int main()
{
int number,i;
printf("Enter the number to be checked\n");
scanf("%d",&number);
for(i=2;i<number/2;i++){
if(number%i==0)
{
printf("The given number %d is not a prime number \n",number);
break;
}
else
{
printf("The given number %d is a prime number \n",number);
break;
}
}
return 0;
}
假设您输入了5,所以输入了for loop first iteration i=2
if(number%i==0)
即5%2==0
,显然 false 现在您的代码转到else
条件print
和break
所以这个休息所做的是,它会停止执行最里面的循环,因为你只有一个循环你的执行停止,因此你得到的错误答案不仅是5的倍数,还有许多其他输入。
else
条件不应该在循环内
一个简单的代码
#include <stdio.h>
int main()
{
int n, i, flag=0;
printf("Enter a positive integer: ");
scanf("%d",&n);
for(i=2;i<=n/2;++i)
{
if(n%i==0)
{
flag=1;
break;
}
}
if (flag==0)
printf("%d is a prime number.",n);
else
printf("%d is not a prime number.",n);
return 0;
}
您应该学习如何使用if-else条件和使用break语句
答案 3 :(得分:0)
程序中有几个错误。
第一个是您不检查输入的数字是否为正数。因此,如果用户输入负数,程序将不会报告任何内容。
第二个错误是,如果用户输入1,2,3或4,那么程序将再次报告任何内容。
第三个错误是你在第一次迭代后退出循环。
考虑到根据C标准函数main,没有参数应声明为
int main( void )
程序可以按以下方式查看
#include <stdio.h>
int main( void )
{
unsigned int number = 0;
printf("Enter the number to be checked: ");
scanf( "%u", &number );
int prime = number == 2 || ( number % 2 && number != 1 );
for ( unsigned int i = 3; prime && i <= number / i; i += 2 )
{
prime = number % i;
}
if ( prime )
{
printf( "The given number %u is a prime number \n", number );
}
else
{
printf( "The given number %u is not a prime number \n", number );
}
return 0;
}
答案 4 :(得分:0)
所以,有几件事......
主要问题是,如果数字可以被i
整除,那么您是否会早早摆脱循环:
if ( num % i == 0 )
break;
else
break;
如果数字可以被i
整除,您只想提前退出循环;否则,请检查i
的下一个值:
for ( i = 2 ; i < number/2; i++ )
{
if ( num % i == 0 )
break;
}
循环后,检查i
是否小于number / 2
;如果是,则number
不是素数:
if ( i < number / 2 )
// number is not prime
else
// number is prime
有几种方法可以加快你的素性测试。首先,您只需要测试number
的平方根,而不是number / 2
。其次,你可以消除对偶数的检查;如果一个数字可以被2
整除,那么它可以被任何偶数整除,所以你只需要检查2
一次。在代码中:
int prime = 0; // initially false
if ( number == 2 ) // 2 is a special case, check separately
{
prime = 1;
}
else if ( number < 2 || number % 2 == 0 )
{
prime = 0; // negative numbers, 0, 1, and even numbers are not prime
}
else
{
prime = 1; // assume prime to begin with
for ( int i = 3; prime && i * i < number; i += 2 ) // continue while prime is true
{ // and i is less than sqrt(number)
prime = number % i;
}
}
printf( "%d is%s prime\n", number, prime ? "" : " not" );