一开始一直10+分,好几个测试点过不去,bug了很久,遂百度,百度到的前两个,如果我没理解错,都是没有假设两个数同时溢出并且相等的情况,然而都能ac。所以不存在这种恐怖的测试点,为了不再继续纠缠,一个溢出就结束了。我知道这样不好,可我真的懒,贴代码。如果有兴趣,我说一下我所说的可以如何解决。首先把用来比较的那个string代表的数拎出来,就算你溢出我还是继续算,不过用一个数去记录你溢出了多少次。然后在二分查找的时候,用同样的方法去算,当溢出次数和最终表现的值都相等时即成立。或者可以写个大整数类,就不存在溢出这种说法了。个人觉得,这种题应该就可以算不严谨了吧,你没给范围那我……写个p
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <algorithm> 5 6 using namespace std; 7 8 typedef long long int ll; 9 const ll inf = (1LL << 63) - 1; 10 11 inline int trans2int(char c)//字母转数字 12 { 13 if (isdigit(c))return c - '0'; 14 return c - 'a' + 10; 15 } 16 17 inline ll trans2rad10(const string& s, ll radix,ll N)//字符串转成整数 18 { 19 ll ret = 0; 20 for (int i = 0;i < s.size();i++) 21 { 22 ret = ret*radix + trans2int(s[i]); 23 if (ret<0 || ret>N)return -1;//溢出就拜拜,其实这个假设不好,只是没有同时溢出&&相等的测试点 24 } 25 26 return ret; 27 } 28 29 ll minch(const string& s) 30 { 31 ll ret = -1; 32 for (int i = 0;i < s.size();i++) 33 { 34 ll t = trans2int(s[i]); 35 if (ret < t) 36 ret = t; 37 } 38 return ret + 1; 39 } 40 41 int main(void) 42 { 43 string n1, n2; 44 int tag; 45 int radix; 46 cin >> n1 >> n2 >> tag >> radix; 47 48 if (tag == 1)swap(n1, n2); 49 ll N2 = trans2rad10(n2, radix, inf); 50 if (N2 < 0) 51 {//这道题我默认没有两个数同时溢出的情况,是个败笔,不过可以ac 52 //看过别人的题解,都是默认tag相关的那个数不溢出的,所以溢出的话就impossible了,累了累了不想继续了。你也可以把这个if去掉,然而这种情况就是默认不溢出了 53 cout << "Impossible" << endl;//然后你发现去掉这个if也能过,其实就是测试点的问题,我不纠结了 54 return 0; 55 } 56 ll low = minch(n1); 57 ll high = N2 + 2;//左开右闭 58 59 ll temp; 60 while (low < high) 61 { 62 temp = (high + low) / 2; 63 ll N1 = trans2rad10(n1, temp, N2); 64 if (N1 < 0 || N1 > N2)high = temp; 65 else if (N1 == N2)break; 66 else low = temp + 1; 67 } 68 if (low >= high)cout << "Impossible" << endl; 69 else cout << temp << endl; 70 71 return 0; 72 }