疑问
暂无
代码
#include "bits/stdc++.h"
using namespace std;
//进制数组长度
const int maxn = 10;
//原始数据
int n;
//进制
int d;
//进制数组
int arr[maxn];
//进制数组的有效长度-1,也就是指数大小
int len;
bool isPrime(int m){
//如果m是1的话
if(m == 1){
return false;
}
//如果m大于1
int sqr = (int) sqrt(1.0 * m);
//记得从2开始,要等于sqr
for(int i=2;i<=sqr;i++){
if(m % i == 0){
return false;
}
}
return true;
}
int main(){
while(1){
scanf("%d",&n);
if(n < 0){
break;
}
scanf("%d",&d);
if(!isPrime(n)){
printf("No\n");
}else{
//是素数则继续探索
//计算进制数
int tmp = n;
len = 0;
do{
arr[len++] = tmp % d;
tmp = tmp / d;
}while(tmp != 0);
//反转数
int rvs = 0;
for(int i=0;i<len;i++){
rvs = rvs * d + arr[i];
}
if(isPrime(rvs)){
printf("Yes\n");
}else{
printf("No\n");
}
}
}
return 0;
}
反思
- 首先要判断这个原来的数字
N
是否是素数再进行下一步操作:
isPrime()
一定要记得特判 1 1 1不是质数!!!,不然会有测试用例过不了的。‘’
二刷代码
-
这里的题意,我还是没有理解清楚,原来是在原数上判断,然后再进制转换,进制转换再反转,将反转之后的数再此变成十进制的数!!!好绕啊。这样的话,其实没有必要用long long了,其次,这样的话,可以使用打表来判断素数。
-
这里明确说了n不是0,那么在进制转换的时候就没啥while前后的问题,但是如果有0,那么while一定要在后面。
//涉及到进制的转换
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
string change(int n,int d){
string a="";
while(n!=0){
a+=to_string(n%d);
n=n/d;
}
return a;
}
bool isPrime(ll a){
if(a<=1){
return false;
}else{
ll sqr = (long long)sqrt(1.0*a);
for(ll i=2;i<=sqr;i++){
if(a%i==0){
return false;
}
}
}
return true;
}
ll rechange(string tmp,int d){
int len = tmp.size();
ll res=0;
for(int i=0;i<len;i++){
res = res*d + (tmp[i]-'0');
}
return res;
}
int main(){
int n,d;
while(scanf("%d",&n)&&n>=0){
scanf("%d",&d);
if(!isPrime(n)){
printf("No\n");
}else{
string tmp = change(n,d);
//然后再change一下
ll next = rechange(tmp,d);
if(isPrime(next)){
printf("Yes\n");
}else{
printf("No\n");
}
}
}
return 0;
}