我正在编写一个C程序来查找数字是否为素数。每当我运行它并输入一个数字时,输入的值就会改变。请指出漏洞。
#include<stdio.h>
#include<conio.h>
int main()
{
int x;
int y;
y=getchar();
for(x=2;x<y;++x){
if(y%x != 0 && y!=x)
printf(" THE NUMBER %d is A PRIME \n", y);
else
printf(" \r THE NUMBER %d IS NOT A PRIME", y);
break;
}
}
我使用Code :: Blocks IDE和GCC Compiler
答案 0 :(得分:5)
getchar
返回单个字符的ASCII码。因此,您的程序会获取您输入的数字的第一个字符的ASCII代码,并检查它是否为素数。
相反,您需要读取整数:
scanf("%d", &y);
完整的计划:
#include<stdio.h>
#include<conio.h>
int main()
{
int x;
int y;
scanf("%d", &y);
for(x=2;x<y;++x){
if(y%x != 0 && y!=x)
printf(" THE NUMBER %d is A PRIME \n", y);
else {
printf(" \r THE NUMBER %d IS NOT A PRIME", y);
break;
}
}
}
注意:您可以在x >= sqrt(y)
答案 1 :(得分:5)
顾名思义,getchar()
从标准输入中获取单个字符。例如,如果输入 3 ,y
将获得字符'3'
的ASCII码,这显然不是您想要的。
尝试scanf
:
scanf("%d", &y);
答案 2 :(得分:2)
好吧,你正在调用用于输入单个字符的getchar()
,这就是你的情况:
getchar()
会返回一个字符。int
类型的变量中时,将字符转换为整数。3
将存储为51
,这是输入更改的原因。您需要做的是输入整数而不是字符。试试这个:
scanf("%d", &y);
希望这有帮助。
答案 3 :(得分:1)
关于y的输入的第一个答案是正确的:
scanf("%d", &y);
另外,请注意你应该循环到x的平方根,如果你想优化你的算法而不是更多(我不会在这里证明为什么,它是一个数学属性)。
#include <stdio.h>
#include <math.h>
// ...
int x;
int x_max;
int y;
scanf("%d", &y);
x_max = (int)floor(sqrt(y));
for(x=2;x<=x_max;++x){
// ...