PAT (Advanced Level) 1015 Reversible Primes (20 分) 【Python/C++】【进制转换】

博客围绕PAT (Advanced Level) 1015 Reversible Primes题目展开,需对给定数判断是否为素数,将其转换成d进制并逆序后再视作十进制判断是否为素数,还提及了Python和C++语言相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT (Advanced Level) 1015 Reversible Primes (20 分)

题意不清的沙雕狗屎题!
给你一个数,判断是否是素数,然后将它转换成d进制,然后再在d进制里逆序,再视作十进制,判断是否是素数。

Python:

import sys
from math import *
#str_in = input()
def is_prime(x):
    flag = 1
    limit = int(sqrt(1.0 * x))
    for i in range(2, limit + 1):
        if x % i == 0:
            flag = 0
            break
    return flag
                    

            

while True:
    str_in = input()
    flag = 1
    a = [int(n) for n in str_in.split()]
    x = int(a[0])
    if x < 0:
        break
    d = int(a[1])

    flag = flag & is_prime(int(x))
    if int(x) == 1:
        print('No')
        exit(0)

    vis = [0]*50
    k = 0

    x = int(x)
    d = int(d)

    while int(x) > 0:
        k = k + 1
        vis[k] = int(x) % d
        x //= d
        #print(x)

    rx = 0
    for i in range(1, k + 1):
        rx = rx * d + vis[i]

    flag = flag & is_prime(rx)
    if rx == 1:
        print('No')
        exit(0)

    if flag == 1:
        print('Yes')
    else:
        print('No')

C++:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long int
#define LL ll
#define INF 0x3f3f3f3f
const int maxn = 1e5 + 10;
int is_prime(LL x) {
	int flag = 1;
	for (int i = 2; i <= (LL)sqrt(1.0*x); i++) {
		if (x % i == 0) {
			flag = 0;
			break;
		}
	}
	return flag;
}
int main()
{
	
	string str;
	int d;
	while (cin >> str) {
		int flag = 1;
		if (str[0] == '-') break;

		cin >> d;
		int x = 0;
		LL rx = 0;//x在d进制下的倒置
		int len = str.length();
		for (int i = 0; i < len; i++) {
			x = x * 10;
			x += str[i] - '0';
		}
		flag = flag & is_prime(x);//计算x是否为素数

		if (x <= 1) {//1不是素数
			puts("No");
			return 0;
		}
	

		int vis[100]; int k = 0;
		while (x) {
			vis[++k] = x % d;
			x /= d;
		}
		for (int i = 1; i <= k; i++) {
			rx *= d;//之前一直乘10,感觉这个题表意不清,且没什么意思
			rx += vis[i];
		}
		
		if (rx <= 1) {//1不是素数
			puts("No");
			return 0;
		}

		flag = flag & is_prime(rx);

		if (flag) {
			puts("Yes");
		}
		else puts("No");
	}
	return 0;
}
//_CRT_SECURE_NO_WARNINGS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值