pat 甲级1010

一开始一直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 }

 

转载于:https://www.cnblogs.com/schsb/p/8811157.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值