素数检测程序改为long类型后所有自然数均被判定为非素数的问题
素数检测程序改为long类型后全部判定非素数的解决方法
你遇到的问题核心是没有同步修改所有关联的类型与格式符,导致类型不匹配引发逻辑异常。以下是修正后的完整代码,以及关键修改点说明:
修正后的代码
#include<stdio.h> // 同步修改函数参数为long类型 int check_prime(long); int main() { long n; // 将存储输入的变量改为long类型 int result; printf("Enter an integer to check whether it is prime or not.\n"); scanf("%ld", &n); // 格式符从%d改为%ld,匹配long类型输入 result = check_prime(n); if (result == 1) printf("%ld is prime.\n", n); // 输出格式符同步改为%ld else printf("%ld is not prime.\n", n); return 0; } int check_prime(long k) // 参数k改为long类型,确保接收正确的数值 { if(k == 1){ return 0; } long c; // 循环变量改为long,避免大数值时int溢出导致循环异常 // 原循环逻辑可保留,也可优化为c*c <= k提升效率 for (c = 2; c <= k - 1; c++) { if (k % c == 0) return 0; } return 1; }
关键修改点说明
- 变量类型同步:将输入变量
n、函数参数k、循环变量c统一改为long,避免类型截断或溢出。 - 格式符匹配:输入输出的格式符从
%d改为%ld,确保long类型数值能正确读取和打印,这是导致全非素数判定的常见原因——格式符不匹配会让输入值读取异常。 - 循环变量类型:当检测超大的long型数值时,int类型的循环变量会溢出为负数,导致循环条件始终成立,最终错误返回非素数结果。
内容的提问来源于stack exchange,提问作者bosh
相关产品推荐
相关产品推荐

