【问题标题】:Finding if a Number if Prime or not In C在C中查找一个数字是否为素数
【发布时间】:2015-08-02 11:03:37
【问题描述】:

我正在编写一个 C 程序来查找一个数字是否为素数。每次我运行它并输入一个数字时,输入的值都会改变。请指出漏洞。

#include<stdio.h>
#include<conio.h>
int main()
{

    int x;
    int y;
    y=getchar();
    for(x=2;x<y;++x){
       if(y%x != 0 && y!=x)
            printf(" THE NUMBER %d is  A  PRIME \n", y);
        else
            printf(" \r THE NUMBER %d IS NOT A PRIME", y);
            break;
    }
}

我将 Code::Blocks IDE 与 GCC 编译器一起使用

【问题讨论】:

  • 调试程序时发现了什么?

标签: c primes


【解决方案1】:

顾名思义,getchar() 从标准输入中获取单个字符。比如你输入3y会得到字符'3'的ASCII码,这显然不是你想要的。

试试scanf:

scanf("%d", &y);

【讨论】:

  • 谢谢...另一个问题..程序只接受一次输入..我可以让它接受多次输入..这是我的代码。 “29 THE NUMBER 29 is A PRIME Process returned 29 (0x1D) execution time : 1.219 s Press any key to continue.”
  • @MukulMehta 使用循环?
  • 使用循环使相同的数字重复。每次程序完成执行时,我都想输入不同的数字。
  • 我修改了它..这工作正常.. #include #include int main() { for(;;){ int x;整数y; scanf("%d", &y); for(x=2;x
  • @MukulMehta,请将代码更改放入原始问题中,而不是 cmets。
【解决方案2】:

getchar 返回单个字符的 ASCII 码。因此,您的程序会获取您输入的数字的第一个字符的 ASCII 码并检查它是否为素数。

相反,您需要读取一个整数:

scanf("%d", &y);

完整的程序:

#include<stdio.h>
#include<conio.h>
int main()
{

    int x;
    int y;
    scanf("%d", &y);
    for(x=2;x<y;++x){
       if(y%x != 0 && y!=x)
            printf(" THE NUMBER %d is  A  PRIME \n", y);
       else {
            printf(" \r THE NUMBER %d IS NOT A PRIME", y);
            break;
       }
    }
}

注意:x &gt;= sqrt(y)时可以停止

【讨论】:

    【解决方案3】:

    好吧,您正在调用getchar(),它用于输入单个字符,这就是您的情况:

    • getchar() 返回一个字符。
    • 然后,当您将字符存储在int 类型的变量中时,字符会转换为整数。
    • 因此该整数包含输入字符的 ASCII,即3 将存储为51,这就是输入更改的原因。

    你需要做的是输入一个整数而不是字符。试试这个:

    scanf("%d", &y);
    

    希望这会有所帮助。

    【讨论】:

    • getchar() 来自stdio.h。我认为您对来自conio.hgetch() 感到困惑
    【解决方案4】:

    关于 y 的输入,第一个答案是正确的:

    scanf("%d", &y);
    

    另外,请注意你应该循环直到 x 的平方根,如果你想优化你的算法而不是更多(我不会在这里解释为什么,这是一个数学属性)。

    #include <stdio.h>
    #include <math.h>
    
    // ...
    
    int x;
    int x_max;
    int y;
    
    scanf("%d", &y);
    x_max = (int)floor(sqrt(y));
    
    for(x=2;x<=x_max;++x){
    
    // ...
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2015-09-15
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多