我正在编写一个程序来判断给定的整数是否为素数.我的程序适用于整数,但当我将其更改为Long时,它会返回每个自然数作为非素数.

#include<stdio.h>
 
int check_prime(int);
 
main()
{
   int n, result;
 
   printf("Enter an integer to check whether it is prime or not.\n");
   scanf("%d",&n);
 
   result = check_prime(n);
 
   if ( result == 1 )
      printf("%d is prime.\n", n);
   else
      printf("%d is not prime.\n", n);
 
   return 0;
}
 
int check_prime(int k)
{
   if(k==1){
       return 0;
   }
   int c;
 
   for ( c = 2 ; c <= k - 1 ; c++ )
   { 
      if ( k%c == 0 )
     return 0;
   }
   return 1;
}

推荐答案

我的程序适用于整数,但当我将其更改为Long时,它会返回每个自然数作为非素数.

"My program works for integers" but not for all int.
check_prime(n) fails when n <= 0.

Enter an integer to check whether it is prime or not.
0
0 is prime.

修复if(k==1){-->;if(k <= 1){

将类型从int转换为long是不够的.代码还必须将scanf()说明符从"%d"转换为"ld".如果没有做到这一点,将导致undefined behavior(UB).

常见的UB是long n; scanf("%d",&n);导致n为零.由于check_prime(0)返回了错误的答案,预计会有许多测试失败.

节省时间.启用所有编译器警告.


for ( c = 2 ; c <= k - 1 ; c++ )对于大的k来说是非常慢的,因为迭代次数高达O(K)次.

使用for ( c = 2 ; c <= k/c ; c++ ).迭代次数高达O(√k)次.

C++相关问答推荐

%p与char* 等组合缺少的GCC Wform警告

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

创建一个fork导致fget无限地重新读取文件

不会停在空格或换行符上的错误

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

向上强制转换C中的数值类型总是可逆的吗?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

在C++中使用函数指针的正确语法

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

从TCP连接启动UDP(C套接字)

==284==错误:AddressSaniizer:堆栈缓冲区下溢

如何将另一个数组添加到集合中,特别是字符串?

For循环不会迭代所有字符串字符吗?(初学者问题)

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

循环中的静态变量与块中的变量和循环

不确定如何处理此编译错误

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

如何用用户输入的多个字符串填充数组?

是什么阻止编译器优化手写的 memcmp()?

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