为什么我的程序返回相同的字符?

时间:2015-04-06 10:24:47

标签: c output

这是一个程序,用于检查输入的数字是否是两个素数(' 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;
}

我不知道为什么这个节目总会回归&#39; Y&#39;即使它应该返回N&#39; N&#39;我只是不知道错误在哪里。

3 个答案:

答案 0 :(得分:2)

部分答案:更好的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)
  • 使用好的变量名称(我只用于循环,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;
 }

答案 1 :(得分:1)

请贬低您的is_prime()功能。代码return 1;应该在for循环之后。您可以尝试以下操作:

  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))

答案 2 :(得分:0)

我已经从main函数修改了一些代码。 请尝试使用以下代码,

而不是这个主要的功能代码:

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;

}