质数判断代码问题:负数转正失效及0、1非质数判定需求
C#质数判断:负数转正数与0/1逻辑修复
问题分析
- 负数转正数的溢出问题:你写的
n = -n在输入为int.MinValue(即-2147483648)时会溢出,因为-int.MinValue等于2147483648,超出了int类型的最大值(2147483647),导致n仍为负数,后续判断逻辑失效。 - 0/1的逻辑缺失:根据质数定义,质数是大于1的自然数,0和1都不属于质数范畴,需要在循环判断前直接处理这类情况。
修正后的代码
int n = int.Parse(Console.ReadLine()); bool isPrime = true; // 安全处理负数:避免int.MinValue溢出问题 if (n == int.MinValue) { isPrime = false; } else { n = Math.Abs(n); } // 直接处理0、1的非质数情况 if (n <= 1) { isPrime = false; } else { // 优化循环范围:仅需遍历到n的平方根,提升效率 for (int i = 2; i * i <= n; i++) { if (n % i == 0) { isPrime = false; break; } } } Console.WriteLine(isPrime ? "Prime" : "Not prime");
关键改动说明
- 负数处理:用
Math.Abs(n)安全获取绝对值,同时单独判断int.MinValue——它的绝对值无法用int存储,且2147483648是偶数,必然不是质数,直接标记为非质数。 - 0/1判断:在循环前检查
n <= 1,直接设置为非质数,完全符合质数的定义规则。 - 循环优化:将循环条件改为
i * i <= n,大幅减少循环次数(比如判断100时,只需循环到10而非99),提升判断效率。
内容的提问来源于stack exchange,提问作者Cral_Cactus
相关产品推荐
相关产品推荐

