当我执行我的代码时,scanf("%d", &n);
不会扫描任何内容,我的意思是,如果我引入任何数字,它都不会执行任何操作,无论我引入的数字如何。
void testEsPrimo() {
int n;
printf("Comprobando si un número es o no primo\n");
printf("Teclee un número entero: ");
fflush(stdout);
scanf("%d", &n); //<---- The problem ?
if(esPrimo(n) == cierto){
printf("%d es primo\n", n);
}else{
printf("%d NO es primo\n", n);
}
fflush(stdout);
}
Logico esPrimo(int n){
int divisor;
int esPrimox;
for(divisor = 2; sqrt(n); divisor++) {
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
} else {
esPrimox =1;
}
}
}
if(esPrimox == 1) {
return cierto;
}
return falso;
}
这是我的esPrimo代码,用于决定数字是否为素数。
typedef enum {falso, cierto} Logico;
这是Logico,在.h文件中定义
PD:这是我在C上的第一步,所以我的代码可能不好。 PD2:请原谅我的英语不好我不是本地人,我的英语不是很好。
答案 0 :(得分:4)
您的scanf
非常完美。
我认为你的错误是来自esPrimo
的循环。实际上你有一个无限循环,因为sqrt(n)
总是具有相同的值,并且它不是布尔表达式。
更改循环:
for(divisor = 2; sqrt(n); divisor++) {
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
} else {
esPrimox =1;
}
}
}
为此:
for(divisor = 2; divisor < sqrt(n); divisor++) {
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
} else {
esPrimox =1;
}
}
}
但是当你知道你的号码不是素数时你会遇到问题:你必须完成循环。 你可以这样做:
for(divisor = 2; divisor < sqrt(n); divisor++) {
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
} else {
esPrimox =1;
break;
}
}
}
但如果您可以避免在循环中使用break
,请不要使用它。
使用复杂的算法,您可以使用干净的代码,但是当您读取循环时,通常您会理解循环执行完全相同的迭代次数。如果您有另一个标志来结束循环,请使用while
。
While (divisor < sqrt(n) && esPrimox == 0){
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
} else {
esPrimox =1;
}
}
}
答案 1 :(得分:1)
esPrimo有两个主要问题。
首先,for循环不会终止:
for(divisor = 2; sqrt(n); divisor++) {
将条件更改为:
for(divisor = 2; divisor <= sqrt(n); divisor++) {
其次是逻辑。如果您发现n
不是素数,则需要中断循环,否则函数将始终返回true
。您可以使用break
语句或在循环条件中检查esPrimox
的值来执行此操作。
以下是使用break
:
for(divisor = 2; divisor <= sqrt(n); divisor++) { /* fixed loop condition */
if(n <= 0) {
return falso;
} else {
if(n%divisor == 0) {
esPrimox = 0;
break; /* break the loop */
} else {
esPrimox =1;
}
}
}