第三章 进位制 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;
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈