PAT (Advanced Level) 1010 Radix (25 分)
发布日期:2021-06-29 12:22:25 浏览次数:3 分类:技术文章

本文共 1980 字,大约阅读时间需要 6 分钟。

序:

不完美才是人生,这道题自己写的永远是24分。

题目概述:

给出两个数a和b,以及进制radix。假设a在radix进制下,问是否存在进制radix1使得b在radix1下与a在radix下的值相等。

分析:

1.全部转成十进制比较,十进制的值用unsigned longlong存,这样最大
2.从2开始尝试radix1,直到100(再多也是差一个测试点),如果值比原十进制数小则continue;相等则输出进制;若大了,则impossible。这里随着进制的增加,一个既定的数的十进制值也会增加。
3.数的每位都必须小于进制数,否则continue。

//尝试到100进制//随着进制的变大,其值会逐渐变大#include
using namespace std;int main(){
string str1, str2, rest; int tag, radix; cin >> str1 >> str2 >> tag >> radix; long long int valin10 = 0; string str; if(tag == 1) {
str = str1; rest = str2;} else if(tag == 2) {
str = str2; rest = str1;} int len = str.size(); int temp; for(int i = 0; i < len; i++) {
if(isdigit(str[len-1-i])) {
temp = str[len-1-i] - '0'; valin10 += temp * pow(radix, i); } else {
temp = str[len-1-i] - 'a' + 10; valin10 += temp * pow(radix, i); } } for(int index = 2; index <= 100; index++) {
unsigned long long tryvalin10 = 0; len = rest.size(); bool flag = true; for(int i = 0; i < len; i++) {
if(isdigit(rest[len-1-i])) {
temp = rest[len-1-i] - '0'; if(temp >= index) flag = false; tryvalin10 += temp * pow(index, i); } else {
temp = rest[len-1-i] - 'a' + 10; if(temp >= index) flag = false; tryvalin10 += temp * pow(index, i); } } if(flag == false) continue; if(tryvalin10 < valin10) continue; else if(tryvalin10 == valin10) {
cout << index << endl; return 0; } else {
cout << "Impossible" << endl; return 0; } } }

总结:

看了柳神的做法,二分可以更快。且她的遍历范围不止100,而是整个可能的进制,但是写法比较晦涩难懂。我在第七个测试点过不了,唯一可能的解释就是这个进制过大了,我没有遍历到。
在这里插入图片描述
请诸位多多指教!

转载地址:https://bridge-killer.blog.csdn.net/article/details/115431888 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:PAT (Advanced Level) 1007 Maximum Subsequence Sum (25 分)
下一篇:PAT (Advanced Level) 1009 Product of Polynomials (25 分)

发表评论

最新留言

很好
[***.229.124.182]2024年04月11日 06时00分00秒