第三章 进位制 AcWing 1492. 可逆质数

第三章 进位制 AcWing 1492. 可逆质数

原题链接

AcWing 1492. 可逆质数

算法标签

数学 进位制

思路

对于将数字 N 转化为 D 进制表示后,再进行反转, 可以类比十进制数字反转

十进制数字反转

实现思想:十进制数字转为十进制反转后转化为十进制

int decimalDigitInversion(int n){
	int res=0;
	while(n){
    	res=res*10+n%10;
    	n/=10;
	}
	return res; 
}
十进制数字转为D进制反转后转化为十进制

秦九韶算法: 将 D 进制的数转化为 10 进制
320 3 b 3203_{b} 3203b => 十进制
3 × b 3 + 2 × b 2 + 0 × b 1 + 3 × b 0 3×b^{3}+2×b^{2}+0×b^{1}+3×b^{0} 3×b3+2×b2+0×b1+3×b0

可以从高位递推得到

int sol(int n, int d){
	int res=0;
	while(n){
		// n%d表示当前数n在d进制下最后一位 反转后即为第一位 
		// 使用秦九韶算法转化为十进制:将已计算的高位进制数(即res)* D进制数 , 加上当前低位进制数 * D进制数的0次方(n%d)  并将res*d+n%d更新为下一轮的已经计算的高位进制数
    	res=res*d+n%d;
    	// 由于n最后一位已计算 n/d保证下次循环计算n倒数第二位
    	n/=d;
	}
	return res; 
}

代码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N = 10005;
//int t, n, m, cnt, ans; 
inline int rd(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
}
bool pri(int n){
    if(n<=1){
        return false;
    }else{
        for(int i=2; i*i<=n; ++i){
            if(!(n%i)){
                return false;
            }
        }
        return true;
    }
}
bool sol(int n, int d){
    int r=0;
    while(n){
        r=r*d+n%d;
        n/=d;
    }
    return pri(r); 
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, d;
	while(scanf("%lld %lld", &n, &d), n>0){
	    if(pri(n)){
	        if(sol(n, d)){
	            puts("Yes");
	        }else {
	            puts("No");
	        }
	    }else{
	        puts("No");
	    }
	}
	return 0;
}

tips

十进制数字反转

实现思想:秦九韶算法

int decimalDigitInversion(int n){
	int res=0;
	while(n){
    	res=res*10+n%10;
    	n/=10;
	}
	return res; 
}
十进制数字反转

实现思想:字符串反转

int decimalDigitInversion(int n){
	string s=to_string(n);
	reverse(s.begin(),s.end());
	int res = atoi(s.c_str());
	return res; 
}

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值