我的Prime号码检查器有什么问题?

时间:2015-07-17 08:02:13

标签: c++ if-statement primes

我创建了一个素数检查程序,用于检查用户输入的数字是否为素数。

它可以轻松检测非素数,但是当我们输入素数时,它会崩溃!

我想我知道为什么,但不知道如何纠正它们......

这是我的计划:

#include "stdafx.h"
#include <iostream>
#include<iomanip>
#include <cmath>
using namespace std;



float Asker()
{
    float n;
    cin >> n;
    return n;
}


int Remainder(int n, int x)
{
    int q = n%x;

    if (q == 0)
        return 1;

    else

        Remainder(n, x + 1 > n);
    /* 
    Here is the PROBLEM
    */
    return 0;
}


int main()
{
    cout << "Enter your Number : ";
    float n = Asker();

    int r = Remainder(n, 2);

    if (r == 1)
        cout << "That Ain't Prime!\n";
    else
        cout << "Yep Thats Prime!\n";

    main();

    return 0;
}

假设,当我输入7时,我知道,它检查到6,然后它应该崩溃!(由于x + 1&gt; n条件)。当其他条件失败时,我不知道如何返回0 ......

3 个答案:

答案 0 :(得分:1)

回答你的问题“我的Prime号码检查器有什么问题?”很多事情都是错的:

  • 请勿在主电话中致电main()。这不是你递归的方式
  • int Remainder(int n, int x)你用float(丢失演员表)然后使用boolRemainder(n, x + 1 > n);
  • 调用它
  • 您的asker不需要是浮动

关于main内的递归,有两个原因:

  • 使用此配置,您将获得无限循环;
  •   

    ISO C ++禁止获取函数':: main'

    的地址

答案 1 :(得分:1)

//#include "stdafx.h"   //This is an invalid header.
#include <iostream>
#include<iomanip>
#include <cmath>
using namespace std;



float Asker()
{
    float n;
    cin >> n;
    return n;
}


int Remainder(int n, int x)
{
    int q = n%x;

    if (q == 0 && n>2 )//'2' have to be excluded.
                   //otherwise 2%2==0 can set
                   //'2' as a non prime which is wrong
        return 1;

    else if(x+1<n)

        Remainder(n, x + 1);
    /*
    Here was the PROBLEM
    Remainder(n, x + 1 > n) 'x + 1 > n ' is an invalid paramrter.
    */
    else
        return 0;
}

    int main()
{
    cout << "Enter your Number : ";
    float n=Asker();
    int r=1;        //It is essential to initialize r to 1

    if(n!=1)        //Have to exclude '1'. Otherwise
                //It will assign '1' as prime which is wrong
        r = Remainder(n, 2);

    if (r == 1 )
        cout << "That Ain't Prime!\n";

    else
        cout << "Yep Thats Prime!\n";
    //main();   //Why are you calling main again?

    return 0;
}
  1. 您的第一个错误是“#include”stdafx.h“”。你在哪里得到这个标题?
  2. 然后在int Remainder(int n,int x)函数中使用递归并发送无效语法“Remainder(n,x + 1&gt; n)”。您不能在参数中使用x + 1&gt; n等语法。
  3. 之后你为什么要在main函数中调用main()? 并且您的算法需要一些触摸,我已添加并在评论中解释。
  4. 但是你应该知道检查质数的最短方法是检查n%x == 0直到x&lt; = square_root(n)。

答案 2 :(得分:-1)

首先,您不必检查所有数字的模数为n-1:只需检查模数为sqrt(n)即可。其次,如果要检查的下一个除数大于sqrt(n),则应该从函数返回0。以下是更正后的Remainder函数。

int Remainder(int n, int x)
{
    int q = n%x;
    if (q == 0)
        return 1;
    else
    {
        if(x+1 > std::sqrt(n)) return 0;
        else return Remainder(n, x + 1);
    }
}

最后,最好将n中的mainAsker中的float更改为int,并返回{{1}的类型}}也应该是Asker

这不是一个令人筋疲力尽的清单,列出了关注素数检查器的问题 - 只是一种快速解决问题的方法。从本质上讲,这样的素数检查器不应该使用递归 - 只需迭代从2到int的所有潜在除数就可以了。