解题过程的小记录,如有错误欢迎指出。
难度:三星(求素数的模板+进制转换模板)
题目分析
给出一个十进制下的数和另外一个进制,如果这个十进制下的数是素数,当它用另外一个进制进行转换后反转然后再次转化为十进制依旧是素数的话,则输出Yes,反之输出No
我的解题过程
思路
- 写一个判断是否是素数的函数,为了节省时间用sqrt
- 首先判断初始给出的十进制数是否是素数,如果不是就没有必要进行后续的步骤
- 将十进制数按给定的进制求余,并且同时将原结果*进制再加上余数(这步想不通的话可以用十进制下的情况代入思考)
- 转换结束后再次判断是否是素数,如若是则输出Yes,反之输出No
bug
- 在PAT自带的编译器中一定要引入algorithm的头文件才可以使用reverse反转字符串
- 刚开始反转后转化为十进制的步骤写错了,高位写成低位的权重了,约等于没有反转,隔了好一会才想明白,下次可以在重要步骤输出结果看一看是否写错
代码
#include<iostream>
#include<math.h>
#include<string>
#include<algorithm>
using namespace std;
bool isPrime(int n) {
if (n <= 1) return false;
int s = (int)sqrt(1.0*n);
for (int i = 2; i <= s; i++) {
if (n%i == 0) return false;
}
return true;
}
int afterReverse(int n, int d) {
string s;
if (d == 10) {
s = to_string(n);
reverse(s.begin(), s.end());
return stoi(s);
}
else {
int result = 0, radix = 1;
while (n != 0) {
//只能通过两个测试点
//result += (n%d)*radix;//破案了!这样写≈没有反转的结果,因为吧高位乘以低位的权重了
//radix *= d;
//可以通过全部测试点
result = result*d + (n%d);
n /= d;
}
return result;
}
}
int main()
{
int n, d;
scanf("%d", &n);
while (n >= 0) {
scanf("%d", &d);
if (!isPrime(n)) {
printf("No\n");
}
else {
n = afterReverse(n, d);
if (!isPrime(n)) {
printf("No\n");
}
else {
printf("Yes\n");
}
}
scanf("%d", &n);
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 以负数结束程序可以用晴神的方法的写
while(scnaf("%d",&n)!=EOF){
if(n < 0) break;
scanf("%d",&d);
}
- 反转后,从高位开始算数的方法,记一记
result = result*d + (n%d);