模数在不应该的时候改变变量值
Modulus altering variable values when it shouldn't
模数正在改变 primer
的值,因为当我在找到模数之前打印它时,我得到了它的实际值,但在找到模数之后它有时变为零或一。这是一个判断用户输入的数字是否为素数的程序。
#include<stdio.h>
int main(){
int num;
int primer;
int mod;
printf("enter num> ");
scanf("%d", &num);
primer = num-1;
while(primer > 0){
mod = num%primer;
if(mod == 0){
printf("not prime");
break;}
if(primer == 1){
printf("prime");
break;}
primer--;}
}
谨防将问题归咎于语言结构(尤其是定义明确的数学结构)。
问题出在您的代码上。它不做你认为它做的事。您正在尝试使用两种相互竞争的方法来完成您的任务。重来。当您遍历可能的除数时,从 2 开始计数。您的变量名选择对您也没有帮助。
记住,电脑不会帮你解决这个任务。作为一名程序员,你的工作首先是自己解决任务,其次才是告诉计算机如何去做。
问题根本不在于模数,当 primer
达到 1 时 num%primer
的结果为 0,因此满足 if 语句的两个条件看 mod == 0
和 primer == 1
都是 true
,一个简单的 if(mod == 0 && primer != 1)
修复了它。至于 primer 有时是 1 和 0 这也是我愚蠢的典型案例,我在 if
语句中检查它的值,因此该值是它被循环减少后的值。
代码因质数而失败,因为它 primer == 1
然后 mod == 0
为真 - 导致“不是质数”。
mod = num%primer;
if (mod == 0) {
printf("not prime");
break;
}
// Too late
if (primer == 1) {
printf("prime");
break;
}
代码效率低下,因为它进行 O(num) 次测试。
备选方案,使用奇数进行测试:[3 ... num
] 的平方根 - 即 divisor*divisor <= num
.
divisor*divisor <= num
重整为 divisor <= num/divisor
以避免溢出。
int isprime(int num) {
if (num % 2 == 0) {
return num == 2; // Only even prime
}
for (int divisor = 3; divisor <= num/divisor; divisor += 2) {
if (num%divisor == 0) {
return 0;
}
}
// Reach this point when num is a prime or an odd less than 3
return num >= 3;
}
模数正在改变 primer
的值,因为当我在找到模数之前打印它时,我得到了它的实际值,但在找到模数之后它有时变为零或一。这是一个判断用户输入的数字是否为素数的程序。
#include<stdio.h>
int main(){
int num;
int primer;
int mod;
printf("enter num> ");
scanf("%d", &num);
primer = num-1;
while(primer > 0){
mod = num%primer;
if(mod == 0){
printf("not prime");
break;}
if(primer == 1){
printf("prime");
break;}
primer--;}
}
谨防将问题归咎于语言结构(尤其是定义明确的数学结构)。
问题出在您的代码上。它不做你认为它做的事。您正在尝试使用两种相互竞争的方法来完成您的任务。重来。当您遍历可能的除数时,从 2 开始计数。您的变量名选择对您也没有帮助。
记住,电脑不会帮你解决这个任务。作为一名程序员,你的工作首先是自己解决任务,其次才是告诉计算机如何去做。
问题根本不在于模数,当 primer
达到 1 时 num%primer
的结果为 0,因此满足 if 语句的两个条件看 mod == 0
和 primer == 1
都是 true
,一个简单的 if(mod == 0 && primer != 1)
修复了它。至于 primer 有时是 1 和 0 这也是我愚蠢的典型案例,我在 if
语句中检查它的值,因此该值是它被循环减少后的值。
代码因质数而失败,因为它 primer == 1
然后 mod == 0
为真 - 导致“不是质数”。
mod = num%primer;
if (mod == 0) {
printf("not prime");
break;
}
// Too late
if (primer == 1) {
printf("prime");
break;
}
代码效率低下,因为它进行 O(num) 次测试。
备选方案,使用奇数进行测试:[3 ... num
] 的平方根 - 即 divisor*divisor <= num
.
divisor*divisor <= num
重整为 divisor <= num/divisor
以避免溢出。
int isprime(int num) {
if (num % 2 == 0) {
return num == 2; // Only even prime
}
for (int divisor = 3; divisor <= num/divisor; divisor += 2) {
if (num%divisor == 0) {
return 0;
}
}
// Reach this point when num is a prime or an odd less than 3
return num >= 3;
}