“素质数”问题 编写程序检验是否为需要的数

检验特定的质数,如果一个数字它本身是质数,它的几个数位交换后仍是质数,它就是“xprime”。无需错误检验

img

img

img

img

主要思路是:拆分出n的各位数字后循环遍历交换,判断是否是素数。
有个问题:如果输入的数字是1位数字怎么处理,比如输入的是3,这个显示什么?
当前的代码里按照3是xprime数来处理的,因为3交换后还是3,3是素数,所以3作为xPrime数据处理的,如果输入的N小于10时需要输出别的,需要修改一下代码。
运行结果:

img

img

代码:

#include <iostream>
#include <iomanip>
using namespace std;
//判断是否是素数
int prime(int n)
{
    if(n<2) return 0;
    for(int i=2;i<n;i++)
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}
//将n的各位数字拆分到数组a
int splitnmb(int n,int a[])
{
    int ws = 0;
    while(n)
    {
        a[ws++] = n%10;
        n/=10;
    }
    return ws;
}

//排序
void sort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(a[j]>a[j+1])//从小到大排序
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1]=t;
            }
        }
    }
}
//得到交换i,j位置后的数
int getData(int a[],int n,int i,int j)
{
    int s = 0;
    for(int k = n-1;k>=0;k--)
    {
        if(k == i)
            s = s* 10 + a[j];
        else if(k==j)
            s = s* 10 + a[i];
        else
            s = s* 10 + a[k];
    }
    return s;
}

//判断是否是xPrime
int isXPrime(int n,int &ws,int nmbs[],int &nk)
{
    int a[32]; //保存数字n的各位数字
    nk = 0;
    ws = splitnmb(n,a);
    if(ws ==1)
    {
        if(prime(n))
            return 1;
        else
            return 0;
    }else
    {
        for(int i=0;i<ws;i++)
        {
            for(int j=i+1;j<ws;j++)
            {
                //交换i和j后的数
                int s = getData(a,ws,i,j);
                if(prime(s))
                    nmbs[nk++] = s;
            }
        }
        if(nk == 0)
            return 0;
        else
        {
            sort(nmbs,nk);
            return 1;
        }
    }
}


//找到n最近的素数
int findprime(int n)
{
    int i;
    int a,b;
    int ws,nmbs[100],nk;
    for(i=n-1;i>=2;i--)
    {
        if(isXPrime(i,ws,nmbs,nk))
        {
            a = i;
            break;
        }
    }
    //
    for(i=n+1;;i++)
    {
        if(isXPrime(i,ws,nmbs,nk))
        {
            b = i;
            break;
        }
    }
    //cout <<"a="<<a <<",b="<<b<<endl;
    if(b-n >= n-a)
        return a;
    else
        return b;
}


int main()
{
    int n;
    int nmbs[100];//保存素数
    int nk = 0;  //素数的个数
    int ws;
    cout <<"Input an integer: ";
    cin >> n;
    if(isXPrime(n,ws,nmbs,nk))
    {
        cout << n <<" is xPrime formed by swapping 2 digits of:"<<endl;
        for(int i=0;i<nk;i++)
        {
            cout << setw(ws) << setfill('0') << nmbs[i];
            if(i<nk-1)
                cout << endl;
        }
    }else
    {
        cout << n <<" is not xPrime"<<endl;
        cout <<"The nearest xPrime is "<< findprime(n);
    }
    
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632