我正在try 创建一个带有调用函数的程序,以判断X数字和Y数字之间是否有任何给定的质数.如果有,就应该把它们打印出来.

我被这个问题困住了,不知道如何解决它,因为它打印所有的数字.

int isPrime(int number) {
    int flag = 0;
    
    for (int i = 2; i < number; ++i) {
        if (number % i == 0) {
            flag = 1;
        }
        if (flag == 0) {
            printf("%d\n", i);
        }
    }
}

int main() { 
    int x, y;
    scanf("%d %d", &x, &y);
        
    // run the loop from x to y
    // for each iteration of loop call isPrime()
    for (int i = x; i <= y; ++i) {
        isPrime(i);
    }
    
    return 0;
}

推荐答案

OP的代码有问题:

  • if (flag == 0) { printf("%d\n", i); }在错误的地方.这项测试需要在for (int i = 2; i < number; ++i)循环之后进行.@Adrian Mole,@Chris.

  • 函数结尾缺少返回语句.@Adrian Mole

  • 即使修复了上述代码,代码也会错误地报告1、0、-1、-2...作为prime美元.

  • for (int i = 2; i < number; ++i)美元的效率低得可怕.测试只需要到number的平方根.

替代代码:

int isPrime(int number) {
  // Check for factors.
  for (int i = 2; i <= number/i; i++) {
    if (number % i == 0) {
      return 0;
    }
  }
  if (number > 1) {
    printf("%d\n", number);
    return 1;
  }
  return 0;
}
  • 一个更classic 的习惯用法不会让isPrime()打印任何东西,只需返回一个标志并让调用代码打印即可.

  • 由于总体目标是报告许多质数,Sieve_of_Eratosthenes是一个更好的方法.

C++相关问答推荐

Apple Libm的罪恶功能

不同到达时间的轮询实现

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

C:fopen是如何实现二进制模式和文本模式的?

自定义变参数函数的C预处置宏和警告 suppress ?

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

对重叠字符串使用MemMove

如何使解释器存储变量

为什么此共享库没有预期的依赖项?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

在吉陀罗中,_2_1_和CONCAT11是什么意思?

计算SIZE_MAX元素的长数组的大小

程序对大输入给出错误答案

浮动目标文件,数据段

C:面筋蛋白';为什么不刷新窗口?

struct 中的qsort,但排序后的 struct 很乱

使用替代日历打印日期

快速准确计算double的小数指数

C simd _m128 晶圆厂

初始化动态分配的布尔二维数组的最佳方法是什么?