题目描述
A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.
Now given any two positive integers N () and D (1<D≤10), you are supposed to tell if N is a reversible prime with radix D.
Input Specification:
The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.
Output Specification:
For each test case, print in one line Yes if N is a reversible prime with radix D, or No if not.
Sample Input:
73 10
23 2
23 10
-2
Sample Output:
Yes
Yes
No
问题分析与伪代码
可逆素数判断函数 IsRePrime(num)
利用一个pair来存储没一行的数据 不用存储,直接进行判断
利用while循环来读取数据
题意理解错了,这是radix,指的是N在radix进制下进行逆置,然后再转为十进制,再判断是不是素数
代码编写
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
int a[111];//二进制下,10^5用 111个数字来表示?
bool IsPrime(int N)
{
if(N<=1) return false;//注意边界条件
int k=2;
int boundry = (int)sqrt(N*1.0);
while(k<=boundry) //求素数的判断范围有问题,需要尽可能的大
{
if(N%k==0)
return false;
k++;
}
return true;
}
int ReversewithD(int N,int D)
{
// 将N改为D进制下的数
int len = 0;
int temp = 0;
do{
a[len++] = N%D;
N = N/D;
} while (N!=0);
for(int i=0;i<len;i++)
{
temp += a[i]*(pow(D,len-i-1));
}
return temp;
}
bool IsRePrime(int N,int D) {
if (IsPrime(N) && IsPrime(ReversewithD(N, D)))
return true;
else return false;
}
int main()
{
int N,D;
pair<int ,int>ND;
while (scanf("%d",&N)!=EOF)
{
if(N<0) break;
scanf("%d",&D);
IsRePrime(N,D)? printf("Yes\n"):printf("No\n");
}
return 0;
}
3.1 更简洁的代码
4. 收获与思考
进制转化会不会写?
素数判断的范围要注意,以及边界条件n<=1!
int boundry = (int)sqrt(N*1.0);
do while 的使用 在需要先读入在判断时很好用
多点测试代码的编写
while (scanf("%d",&N)!=EOF)
{
if(N<0) break;
scanf("%d",&D);
IsRePrime(N,D)? printf("Yes\n"):printf("No\n");
}