当我执行代码时,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:对不起,我的英语不好,我不是母语,我的英语不是很好。
你scanf
是完美的。
我认为您的错误是for的循环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;
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句