为什么我的程序return相同的字符?
Why does my program return the same character?
这是一个检查输入数字是否为两个质数 ('Y') 或 ('N') 的乘积的程序。
#include <stdio.h>
// the function checks if the number is prime
int is_prime(int z) {
int i;
for(i=2; i<z; i++){
if(z%i == 0){
return 0;
}
return 1;
}
}
/* the function checks if the given number is a
product of two prime numbers bigger than 2*/
int is_prime_product(int x) {
int j;
for(j=2; j<x; j++){
if(x%j == 0){
if(is_prime(x/j) && is_prime(j)){
return 1;
break;
}else return 0;
}
}
}
int main() {
int n=0;
int c;
do{
c=getchar();
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
我不知道为什么这个程序总是 returns 'Y' 即使它应该 return 'N'。就是看不出哪里错了
我已经修改了你的主要功能的一些代码。
请尝试使用以下代码一次,
代替这个主要功能代码:
int main() {
int n=0;
int c;
do{
c=getchar();
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
使用此代码:
int main() {
int n=0;
int c;
scanf("%d",&c);
do{
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
请修改你的is_prime()
功能。代码return 1;
应该在for
之后 loop.You可以试试下面的:
int is_prime (int z)
{
int i;
for (i = 2; i < z; i++)
{
if (z % i == 0)
{
return 0;
}
}
return 1;
}
你的函数is_prime_product ()
应该写成如下:
int is_prime_product (int x)
{
int j;
for (j = 2; j < x; j++)
{
if (x%j==0&&is_prime (x / j) && is_prime (j))
{
return 1;
}
}
return 0;
}
您还应该使用 if (is_prime_product (n))
而不是 if (is_prime_product (c))
。
部分答案:is_prime的更好版本:
int is_prime(int z)
{
if(z <= 1) return 0;
if(z == 2) return 1;
int i;
for(i=3; i<sqrt(z); i+=2)
{
if(z%i == 0) return 0;
}
return 1;
}
在 2 的测试之后,测试奇数因子直到测试数的平方根就足够了。 (还修复了大括号)
您的错误原因:
if(is_prime_product(n)) ...
测试输入数字n
不是最后一个字符c
编辑
关于更好(更易读、更可靠等)代码的一些提示:
- 使用匹配问题的类型(bool 而不是 int)
- 使用好的变量名(i 仅用于循环,z 仅用于浮点数)
- 使用有意义的变量名(数字而不是 n)
- 一致的大括号,运算符周围的间距
这些东西很重要!
看看:
bool is_prime(unsigned int number)
{
if(number <= 1) return false;
if(number == 2) return true;
for(unsigned int factor = 3; factor < sqrt(number); factor += 2)
{
if(number % factor == 0) return false;
}
return true;
}
这是一个检查输入数字是否为两个质数 ('Y') 或 ('N') 的乘积的程序。
#include <stdio.h>
// the function checks if the number is prime
int is_prime(int z) {
int i;
for(i=2; i<z; i++){
if(z%i == 0){
return 0;
}
return 1;
}
}
/* the function checks if the given number is a
product of two prime numbers bigger than 2*/
int is_prime_product(int x) {
int j;
for(j=2; j<x; j++){
if(x%j == 0){
if(is_prime(x/j) && is_prime(j)){
return 1;
break;
}else return 0;
}
}
}
int main() {
int n=0;
int c;
do{
c=getchar();
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
我不知道为什么这个程序总是 returns 'Y' 即使它应该 return 'N'。就是看不出哪里错了
我已经修改了你的主要功能的一些代码。 请尝试使用以下代码一次,
代替这个主要功能代码:
int main() {
int n=0;
int c;
do{
c=getchar();
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
使用此代码:
int main() {
int n=0;
int c;
scanf("%d",&c);
do{
if((c>='0') && (c<='9')){
n= n*10+(c-'0');
}
} while (('0'<=c) && (c<='9'));
if(is_prime_product(c)){
putchar('Y');
}else{
putchar('N');
}
return 0;
}
请修改你的is_prime()
功能。代码return 1;
应该在for
之后 loop.You可以试试下面的:
int is_prime (int z)
{
int i;
for (i = 2; i < z; i++)
{
if (z % i == 0)
{
return 0;
}
}
return 1;
}
你的函数is_prime_product ()
应该写成如下:
int is_prime_product (int x)
{
int j;
for (j = 2; j < x; j++)
{
if (x%j==0&&is_prime (x / j) && is_prime (j))
{
return 1;
}
}
return 0;
}
您还应该使用 if (is_prime_product (n))
而不是 if (is_prime_product (c))
。
部分答案:is_prime的更好版本:
int is_prime(int z)
{
if(z <= 1) return 0;
if(z == 2) return 1;
int i;
for(i=3; i<sqrt(z); i+=2)
{
if(z%i == 0) return 0;
}
return 1;
}
在 2 的测试之后,测试奇数因子直到测试数的平方根就足够了。 (还修复了大括号)
您的错误原因:
if(is_prime_product(n)) ...
测试输入数字n
不是最后一个字符c
编辑
关于更好(更易读、更可靠等)代码的一些提示:
- 使用匹配问题的类型(bool 而不是 int)
- 使用好的变量名(i 仅用于循环,z 仅用于浮点数)
- 使用有意义的变量名(数字而不是 n)
- 一致的大括号,运算符周围的间距
这些东西很重要!
看看:
bool is_prime(unsigned int number)
{
if(number <= 1) return false;
if(number == 2) return true;
for(unsigned int factor = 3; factor < sqrt(number); factor += 2)
{
if(number % factor == 0) return false;
}
return true;
}