【PAT】甲级1010 - Radix(二分 & 有坑)
2017-07-20 13:31
267 查看
题目链接:点击打开题目
这题思路并不是很难,但是有几个坑点!
①首先要用longlong类型应该不难看出来。
②试答案的时候不能顺序搜索,要用二分搜索。
③二分的边界要想对,最小的应该是数中最小的那个数+1,比如:123a,那么这个数最小的进制数为11(因为数中有a)。最大的边界应该为基准数的十进制值(例如:基准数的十进制为为1000000,另一个数为10,那么它可以是1000000进制的,也满足条件)。
④如果算的进制数太大时,可能会爆longlong,那么在计算中还要注意对溢出的判断(num<0)。
代码如下:
这题思路并不是很难,但是有几个坑点!
①首先要用longlong类型应该不难看出来。
②试答案的时候不能顺序搜索,要用二分搜索。
③二分的边界要想对,最小的应该是数中最小的那个数+1,比如:123a,那么这个数最小的进制数为11(因为数中有a)。最大的边界应该为基准数的十进制值(例如:基准数的十进制为为1000000,另一个数为10,那么它可以是1000000进制的,也满足条件)。
④如果算的进制数太大时,可能会爆longlong,那么在计算中还要注意对溢出的判断(num<0)。
代码如下:
#include<queue> #include<cmath> #include<stack> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f #define CLR(a,b) memset(a,b,sizeof(a)) #define PI acos(-1.0) LL toNum(char c) //转化为阿拉伯数字 { if (c >= '0' && c <= '9') return c-'0'; return c-'a'+10; } LL toDecimal(string str,LL radix) //转到十进制 { LL num = 0; LL ant = 1; for (int i = str.size()-1 ; i >= 0 ; i-- , ant *= radix) { num += ant * toNum(str[i]); if (num < 0 || ant < 0) //需要判断这个,也许进制太大了呢 return -1; } return num; } int main() { string a,b; int tag,radix; LL l,r,mid; cin >> a >> b >> tag >> radix; if (tag == 2) swap(a,b); LL base = toDecimal(a,radix); l = 2; r = base; for (int i = 0 ; i < b.size() ; i++) //算出最低的进制数 { l = max(l , toNum(b[i])+1); } while (r >= l) //二分查找第一个大于base的进制数 { mid = (l+r) >> 1; LL t = toDecimal(b,mid); if (t >= base || t == -1) //-1时太大溢出了 r = mid-1; else l = mid+1; } if (toDecimal(b,l) == base) //验证一下是否相等 cout << l << endl; else puts("Impossible"); return 0; }
相关文章推荐
- PAT甲级1010【Radix】二分搜索java题解
- PAT(甲级)1010. Radix (25)
- PAT甲级-1010. Radix (25)进制
- pat 甲级 1010. Radix (25)
- PAT甲题题解-1010. Radix (25)-二分搜索
- [PAT-甲级]1010.Radix
- 1010. Radix (25)-PAT甲级真题(二分法)
- pat甲级1010. Radix (25)
- PAT (Advanced Level)1010. Radix (25) 二分搜索
- pat 甲1010. Radix(二分)
- PAT-甲级-1010 Radix(25)
- PAT 甲级 1010. Radix (25)
- pat甲级1010. Radix (25)
- PAT甲级1010:Radix
- 1010. Radix (25) PAT 甲级
- PAT甲级1010. Radix (25)
- PAT 甲级 1010.Radix (25)
- [PAT甲级]1010. Radix (25)(求另一个数的基数)
- PAT(Advanced Level) 1010 - Radix(二分)
- PAT甲级 1010. Radix (25)