7-7 任意进制下的可逆素数 (15分)

本文介绍了一种算法,用于判断一个数是否为任意进制下的可逆素数。即,该数自身为素数,且在任意进制下逆序后所得数仍为素数。文章提供了完整的AC代码实现,包括将进制字符串转换为十进制数的函数Atoi,以及将十进制数转换为指定进制字符串的函数intToA。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-7 任意进制下的可逆素数 (15分)

任意进制下的可逆素数是这样定义的:它自身是一个素数,当它转换为任意进制之后,把所有数字逆序,得到的新数字的值仍然是一个素数。比如,73在十进制下是一个素数,它在十进制下的逆37也是一个素数,那就称它是十进制下是一个可逆素数。

输入格式:
输入有多行,每行包括两个正整数,数N以及基R,其中N<100000, 1<D<=10, 遇到负数则退出。

输出格式:
对每一行输入,如果是可逆素数,则输出“Yes”,否则输出“No”
s
输入样例:
在这里给出一组输入。例如:

73 10
23 2
23 10
-2

输出样例:
在这里给出相应的输出。例如:

Yes
Yes
No

样例说明:23的二进制是10111,其逆为11101,对应的十进制数是29,所以是可逆素数。

AC代码

#include<bits/stdc++.h>
using namespace std;
int Atoi(string s,int radix)    //s是给定的radix进制字符串
{
	int ans=0;
	for(int i=0;i<s.size();i++)
	{
		char t=s[i];
		if(t>='0'&&t<='9') ans=ans*radix+t-'0';
		else ans=ans*radix+t-'a'+10;
	}
		return ans;
}


string intToA(int n,int radix)    //n是待转数字,radix是指定的进制
{
	string ans="";
	do{
		int t=n%radix;
		if(t>=0&&t<=9)	ans+=t+'0';
		else ans+=t-10+'a';
		n/=radix;
	}while(n!=0);	//使用do{}while()以防止输入为0的情况
	reverse(ans.begin(),ans.end());
	return ans;	
}
int main(){
	int n,m;
	int a[100002]={0};
	for(int i=3;i<100002;i+=2){
		int flag = 1;
		for(int j=2;j<=int(sqrt(i));j++){
			if(i%j==0){
				flag=0;
				break;
			}
		}
		if(flag){
			a[i]=1;		
		}	
	}
	while(1){
		cin>>n;
		if(n<0){
			break;
		}
		cin>>m;
		if(a[n]==0){
			cout<<"No"<<endl;
			continue;
		}
		else{
			string tmp_str= intToA(n,m);
			reverse(tmp_str.begin(),tmp_str.end());
			char *str_to_=(char*)tmp_str.c_str();
			int data = Atoi(str_to_,m);
			if(a[data]==1){
				cout<<"Yes"<<endl;
			}
			else{
				cout<<"No"<<endl;
			}
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值