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

标签 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;
}

最佳答案

它不应该挂断至少 n=6

1.试试这个

  • 代替:

    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&1)==0 而不是 (n%2)==0)
  • 其余的:

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

2.代替sqrt(n)使用数字的一半

3.不要在for里面计算sqrt(有些编译器不预先计算)

4.使用亚里士多德筛法

  • 创建一个或多个数组,这将消除您的一些 split
  • 不要忘记使用数组大小​​作为其中分隔符的常见倍数
  • 这可以大大加快速度
  • 因为它可以通过单个数组访问消除许多 for 循环
  • 但它需要在使用前对数组进行初始化
  • 例如数组

    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.除以质数

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

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

6.你可以将以上所有组合在一起

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

  • 如果您需要更快的速度,请学习

关于C++ 程序在调用函数时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21474322/

相关文章:

c++ - 有关将 SIP 库移植到 PSP 的帮助

C++ lambda 的三元赋值

c++ - C++中的打印相反三角形函数

function - 确定 XQuery 中出现的频率

javascript - 如何在我的应用程序堆栈中处理非ASCII UTF-8字符

c++ - 编译错误:ifstream::open 只接受引号 ""中的字符串值而不接受字符串变量

python - Python如何在另一个函数中调用一个带参数的函数?

具有适用于左值和右值的引用参数的 C++ 函数

javascript - 我对这个条件 "value || value"赋值的理解正确吗?

php - 如何在 PHP 自定义 mysqli 函数中显示 SQL 错误?