调用函数时C ++程序挂起

时间:2014-01-31 07:07:20

标签: c++ function

我编写了一个代码来检查整数是否为素数,无论何时我调用该函数,命令行都会挂起。 我在Windows 7中使用MingW

#include<iostream>
#include<math.h>
using namespace std;
bool checkPrime(int n);
int main()
{
    int t,tempstart;
    cout<<checkPrime(6);
    return 0;
}
bool checkPrime(int n)
{
    bool check=true;
    for (int i = 0; i <(int) sqrt(n) ; i++)
    {
        if(n%i==0)
        {
            check=false;
            cout<<"asas";
            break;
        }
    }
    return check;
}

2 个答案:

答案 0 :(得分:4)

它不应该挂起,至少不能挂起n = 6

1.try this

  • 而不是:

    if(n%i==0) 
    
  • 写:

    if((n%i)==0) 
    
  • 一些编译器在多操作条件下弄得一团糟,因此包围通常会有帮助

2.提到我应该从2

  • n%0被零除也许您的代码被抛出隐藏异常,这就是错误

3.您是否尝试调试

  • 在for循环中获取断点并逐步执行它,看看为什么它在i == 2,3
  • 时没有停止

加快一点的提示(对于更大的n来说只需几千次)

1.I = 2,3,5,7,9,11,13,...

  • 如评论中所述,i = 2分开(由(n&amp; 1)== 0代替(n%2)== 0)
  • 和其他人:

    for (nn=sqrt(n),i=3;i<=nn;i+=2) ...
    

2.而不是sqrt(n)使用数字和半位

3.不要计算内部的sqrt(某些编译器不预先计算)

4.使用亚里士多德的筛子

  • 创建一个或多个数组,这将消除您的一些分歧
  • 不要忘记使用数组大小​​作为其中常见的分隔符乘法
  • 这可以大大加快事情的发展。
  • 因为它可以消除许多具有单个阵列访问的循环
  • 但它需要在使用之前初始化数组
  • 例如数组

    BYTE sieve[4106301>>1]; //only odd numbers are important so the size is half and each bit hold one sieve value so the size is really 4106301*8 which is divided by:
    
  • 可以拿着分隔物的筛子:

  • 3,5,7,11,13,17,19,23,137,131,127,113,83,61,107,101,
  • 103,67,37,41,43,53,59,97,89,109,79,73,71,31,29

5.divide by primes

  • 你可以记住某些数组中的前M个素数(例如前100个素数)
  • 并除以它们
  • 和使用

    for (nn=sqrt(n),i=last prime+2;i<=nn;i++) ...
    
  • 你也可以记住在某些列表中运行时计算的所有素数并使用它们

6.你可以将所有这些结合在一起

7.还有很多其他方法可以提高is_prime(n)的性能吗?

  • 如果您需要更快的速度,请研究

答案 1 :(得分:1)

根据C ++中的运算符优先级 %优先于== 所以你应该使用

if((n%i)==0)
祝你好运!