【问题标题】:Prime Numbers in C [closed]C中的素数[关闭]
【发布时间】:2012-11-25 10:55:08
【问题描述】:

第一个程序

#include<stdio.h>

void main()
{
    int n,c;
    printf("enter a numb");
    scanf( "%i", &n);

    for( c = 2; c <= n; c++){
        if( n % c == 0 )
            break;
    }

    if( c == n )
        printf("\nprime\n");
    else
        printf("\nnot prime\n");
    getchar();
}

第二个节目

#include "stdio.h>

int main()
{
    printf("Enter a Number\n");
    int in, loop, rem, chk;
    scanf("%d",&in);

    for ( loop = 1; loop <= in; loop++){
        rem = in % loop;
        if( rem == 0)
            chk = chk +1;
    }
    if ( chk == 2 )
        printf("\nPRIME NUM ENTERED\n");
    else
    printf("\nNUM ENTERED NOT PRIME\n");
    getchar();
}

第二个程序可以工作,但第一个是我朋友写的,程序看起来不错,但通过单步执行检查后,我们发现第一个程序中的 if 条件在每个输入下都成立,所以什么这里的逻辑错误请帮我找出来......

【问题讨论】:

  • 在低效算法上没有 cmets:您的 scanf() 需要 n地址(即 &amp;n),而不是 n

标签: c loops if-statement primes break


【解决方案1】:

如果我们讨论的是第一个程序,那么读取整数 n 的方式就有问题。你需要传递它的地址:

printf("enter a numb");
scanf("%i",&n);

我很惊讶你的编译器没有捕捉到这个。

【讨论】:

  • +1:确实如此,但作为警告,这些天如此受到关注。 -Wall -Werrorftw.
【解决方案2】:

第一个条件是错误的:

       for(c=2;c<=n;c++)

你必须去到 n/2。在您的情况下,条件始终为真,因为当 c == n 时 n % c 等于 0 并且您到达休息时间。

素数的定义是它唯一的除数是1和它自己。

所以正确的 for 语句是:

for (c = 2; c < = n / 2; c++)

编辑:

实际上,在达到 trunc(sqrt(n)) 之后,应该不会再有除数了。

     for (c=2; c < trunc(sqrt(n)) c++)

【讨论】:

  • 如果n==c,程序返回“prime”;尽管这效率不高,但它是正确的。
  • 相信优化器也可以通过重复重新评估来 const-expr-out 出 trunc(sqrt(n)),ic。
【解决方案3】:

你的程序逻辑是正确的。 问题出在您的 scanf 语句中...您需要传递变量的地址。 应该是:scanf("%i",&amp;n);

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多