反向素数

时间:2018-05-17 20:42:33

标签: c++ numbers calculation

我想检查一个数字a及其反面是否为素数。 必须从键盘读取该号码。

限制是:

  • 1≤a≤2000000000
  • a没有最后一位0

以下是a的一些示例输入和预期输出

Input  Output
5      Yes
112    No
17     Yes

以下是我的尝试:

#include <iostream>
using namespace std;

int main()
{
    int a;
    cin>>a;
    int RevNum =0;
    int Remain;
    int i=2;
    int prim = 1;
    int a_inainte = a;
    if ( (1 <= a && a <= 2000000000) && (a % 10 != 0) )
    {
            while(a != 0)
            {
                Remain = a % 10;
                RevNum = RevNum * 10 + Remain;
                a /= 10;
            }

            if (i < RevNum && i< a_inainte)
            {
                if (RevNum % i == 0 || a_inainte % i ==0)
                    prim = 0;
                ++i;
            }

            if (RevNum == 1 && a_inainte == 1)
                prim = 0;
            if (prim == 1)
                cout<<"DA";
            else
                cout<<"NU";
        }
        else
        {
            cout<<"NU";
        }
    return 0;
    }

我不确定为什么但是代码块中的所有内容似乎都没问题,但我仍然没有在测试中得到所有分数(这是因为编译器检查代码的代码更多)。

2 个答案:

答案 0 :(得分:3)

您可以编写一个简短的函数来检查数字的素数。

我在pseudocode code from Wikipedia上使用了以下代码。有关其工作原理的解释在此深入解释,但主要是为了测试数字n是否为素数,您需要检查它是否可以被i中的任何素数2整除} sqrt(n)

bool is_prime(int n) {
    if (n <= 1)
        return false;
    else if (n <= 3)
        return true;
    else if (n % 2 == 0 || n % 3 == 0)
        return false;

    int i = 5;
    while (i*i <= n) {
         if (n % i == 0 || n % (i + 2) == 0)
             return false;
         i += 6;
    }
    return true;
}

现在,您可以通过调用

来检查a是否为素数
is_prime(a);

要检查反向是否为素数,您需要计算a的尊重。我找到了Arslan7041 here的一个有趣的方法,它的工作方式与你现在的工作方式非常相似:

int reverse(int x) {
    bool negative = false;
    if(x < 0) {
        negative = true;
        x = -x;
    }

    int reversed = 0;
    while(x > 0) {
        reversed = reversed*10 + x%10;
        x /= 10;
    }

    if(negative) reversed = -reversed;

    return reversed;
}

现在,您可以使用以下内容检查a的反向是否为素数:

 is_prime(reverse(a));

最后,我们可以使用简单的if语句解决您的特殊限制。

if (1 <= a && a <= 2000000000 && a % 10 != 0 
    && is_prime(a) && is_prime(reverse(a)) ) {
    cout << "DA\n";
}

答案 1 :(得分:2)

我想你想通过将所有整数除以小于或等于这些数a来验证a的a或反向是素数,但是在代码中你只是除以i = 2和i = 3。必须迭代i。