程序陷入僵局

时间:2014-02-08 04:38:26

标签: c performance

我有一个简单的c程序,它接受两个整数,给出平均值,并检查它们是否是素数。当我运行它并给用户输入时,程序会停止运行,直到我点击esc才会执行任何操作。一旦我点击了esc,它就会给我正确的结果。这是服务器或我的代码的问题吗?

这是我的代码:

   #include <stdio.h>
  2 #include "prime.h"
  3 
  4 int main()
  5 {
  6         int x, y;
  7         float avg;
  8 
  9         /* Get integers x and y from user */
 10         printf("Please enter two positive integers\n");
 11         scanf("%d %d", &x, &y);
 12         scanf("%d", &x, &y);
 13         printf("You typed in %d and %d\n", x, y);
 14         avg = (x+y)/2;
 15         printf("The average is: %f\n", avg);
 16 
 17       /* Test if x and y are prime */
 18          if(prime(x) == 1)
 19              printf("%d is prime\n", x);
 20          else
 21              printf("%d is not prime\n", x);
 22          if(prime(y) == 1)
 23              printf("%d is prime\n", y);
 24          else
 25              printf("%d is not prime\n", y);
 26 
 27         return 0;
 28 }

prime.c:

     1 #include "prime.h"
  2 
  3 int prime(int x)
  4 {
  5     int isprime;
  6     int i;
  7 
  8     for(i = sqrt(x); i > 1; i--)
  9         {
 10             if(x % i == 0)
 11 
 12             /* isprime is false*/
 13                 isprime = 0;
 14             else{
 15 
 16             /* isprime is true*/
 17                 isprime = 1;
 18                 }
 19             }
 20    return isprime;
 21 }

谢谢!

2 个答案:

答案 0 :(得分:1)

第12行你有一个额外的scanf,摆脱它:

12    //scanf("%d", &x, &y);

这就是你必须点击逃生或再次进入的原因。

最重要的是,你的素数逻辑中有一个错误,因为第17行,任何不能被2整除的东西都会被称为素数:

isprime = 1;

这表示即使您找到了另一个可分割的数字,该值也是非常重要的。因此,如果你想象通过数字15,它会发现i = 5并且说isprime = 0;但是它会到2并说isprime = 1;不好。

要解决这个问题,请在isprime = 0之后添加一个中断;像这样:

isprime = 0;
break;

此外,你可以摆脱其他人,我们不需要它,我们将开始假设它是素数。如果你击中任何除数,你就知道它不是素数:

  7     isprime = 1;
  8     for(i = sqrt(x); i > 1; i--)
  9         {
 10             if(x % i == 0)
 11 
 12             /* isprime is false*/
 13                 isprime = 0;
 14                 break;
 15             }

答案 1 :(得分:0)

由于else子句,isprime的值取决于最后检查的情况,即2.如果一个数字不能被2整除,它可能被错误地标记为素数,那么

prime.c将不会执行缩进的操作。 。以下代码更好。

#include<math.h>
int prime(int x)
{
    int i;
    for(i=sqrt(x);i>1;--i)
        {
         if(x%i==0)
            return 0;
        }
    return 1;
 }