m0_66748765 2022-10-29 09:48 采纳率: 66.7%
浏览 26
已结题

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

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

img

img

img

img

  • 写回答

2条回答 默认 最新

  • 关注

    主要思路是:拆分出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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月31日
  • 已采纳回答 10月31日
  • 创建了问题 10月29日