我使用了以下代码,它显示了像49这样的数字作为素数而不是复合数。我是编程新手,所以请帮我正确的代码。
#include <stdio.h>
int main()
{
int n;
int i;
scanf ("%d", &n);
for (i=2; i<n; i++)
{
if (n%i==0)
{
printf ("number is composite");
}
else
{
i=i+1;
}
}
printf("number is prime");
return 0;
}
答案 0 :(得分:2)
您可以按如下方式修改循环 -
if(n%2==0 && n!=2){ //if 2's multiple is entered no need of loop just check this
printf("number is composite");
return 2; // for sake I just returned 2
}
for (i=3; i<n;i=i+2)
{
if (n%i==0) // if this is true
{
printf ("number is composite"); // print this
return 1; // return from function no further iterations
}
}
通过这种方式,当if
条件为true
且其块中的代码执行时,您将停止循环。
答案 1 :(得分:2)
当您发现该数字是复合数字时,您没有停止循环,因此复合数字会同时获得这两个消息。
如果i
不是n
的因素,则您向i
添加1,但for
循环再次添加1。这意味着,对于不的每个数字n
因子,您都会跳过一个数字。
printf("number is prime");
未被任何类型的if包围,因此无论数字是否实际为素数,它都将始终打印。与人类不同,计算机不会因打印冲突的信息而三思而后行,因为计算机无法解释我们所做的行为。
您可以通过查看更少的数字来优化代码。只检查数字的平方根。
此代码未经测试但应该可以使用。请注意,这只会消除对平方根以上因子的检查,但不以前检查过的因子的任何倍数(例如,这样编写,程序将检查该数字是否可被2整除但也被4整除,6,8,10等。)
#include <stdio.h>
#include <math.h>
int main()
{
int n;
int i;
int isComposite = 0;
scanf ("%d", &n);
for (i = 2; i <= (int)sqrt((double)n); i++){
if (n % i == 0){
printf ("number is composite");
isComposite = 1;
break;
}
}
if (!isComposite){
printf("number is prime");
}
return 0;
}
答案 2 :(得分:1)
您应该移除i=i+1
行,您已经在for (i=2; i<n; i++)
之后,您必须在循环之后设置条件,以防止每次检查时打印结果。
#include <stdio.h>
int main()
{
int n;
int i;
scanf ("%d", &n);
for (i = 2; i<n; ++i)
{
if (n%i==0)
{
printf ("number is composite, divisible by %d\n", i);
break;
}
printf("i=%d\n", i);
}
if (n%i != 0)
printf("number is prime\n");
return 0;
}
答案 3 :(得分:0)
结合所有建议和评论,提供:
int q= (int) sqrt(n);
if (n%2==0)
{
printf ("number is composite"); // print this
return 1; // return from function no further iterations
}
for (i=3; i<=q; i += 2)
{
if (n%i==0) // if this is true
{
printf ("number is composite"); // print this
return 1; // return from function no further iterations
}
}
答案 4 :(得分:0)
你获得49个复合词的原因是因为这一行:
else
{
i=i+1;
}
这会导致您在支票中跳过奇数,而49则是7 * 7,因此输出的结果是它是素数。
您遇到的另一个问题是,当您获得复合数时,不会停止循环,并且在结束时,无论循环中发生什么,您都将调用此行代码。
printf("number is prime");
这是一个更好的做法: 创建一个函数,如果它是素数则返回1,如果不是则返回0。 如果你意识到它是一个复合数字,你应该立即返回。如果你到达循环的末尾,那么它就是一个素数。 此外,您可以将循环运行到n的平方根以获得较少量的迭代,而不是直到n。 祝你好运
int isPrime(int n)
{
int i;
for (i = 2; i < (int) sqrt(n) ; i++)
{
if (n % i == 0)
{
printf("number is composite");
return 0;
}
}
printf("number is prime");
return 1;
}
答案 5 :(得分:0)
你在这里。
character
如果要按顺序输入
#include <stdio.h>
int main( void )
{
while ( 1 )
{
unsigned int n = 0;
_Bool prime;
printf( "\nEnter a non-negative number (0-exit): " );
scanf( "%u", &n );
if ( !n ) break;
prime = n == 2 || ( n % 2 && n != 1 );
for ( unsigned i = 3; prime && i * i <= n; i += 2 )
{
prime = n % i;
}
printf( "Number %u is %s\n", n, prime ? "prime" : "composite" );
}
return 0;
}
然后输出
1 2 3 4 5 6 7 8 9 0
答案 6 :(得分:0)
查找数字是否为质数的另一种方法可以是:-`
equals
这里的逻辑是将测试用例的数量限制为(被测试的数量与循环计数器的值的商),因为除数不能超过该商。