检验特定的质数,如果一个数字它本身是质数,它的几个数位交换后仍是质数,它就是“xprime”。无需错误检验
主要思路是:拆分出n的各位数字后循环遍历交换,判断是否是素数。
有个问题:如果输入的数字是1位数字怎么处理,比如输入的是3,这个显示什么?
当前的代码里按照3是xprime数来处理的,因为3交换后还是3,3是素数,所以3作为xPrime数据处理的,如果输入的N小于10时需要输出别的,需要修改一下代码。
运行结果:
代码:
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!