1010 Radix (25 分)


/*首先是radix的范围问题  最小应该是字母最大值+1, 最大在num和字母最大值+1选最大值
二分法  主要左边界和右边界的更新,不然会陷入死循环...
还有变量名不要冲突  不然一直找不到错在哪............. 
*/

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
	string n1, n2;

	int tag, r;
	ll maxa=0, maxb=0;


	cin >> n1 >> n2 >> tag >> r;
	if(n1 == n2) {
		cout << r << endl;
		return 0;
	}

	int l1 = n1.length(), l2 = n2.length();

	ll a[l1+5], b[l2+5];

	for(int i=0; i<l1; i++) {
		if(n1[i] <= '9' && n1[i] >= '0') {
			a[i] = n1[i]-'0';
		} else a[i] = (n1[i]-'a'+10);
		
		maxa = max(maxa, a[i]);
	}
	for(int i=0; i<l2; i++) {
		if(n2[i] <= '9' && n2[i] >= '0') {
			b[i] = n2[i]-'0';
		} else b[i] = (n2[i]-'a'+10);
		maxb = max(maxb, b[i]);
	}

	ll num = 0;

	if(tag == 1) {
		for(int i=0; i<l1; i++) {
			num *= r;
			num += a[i];
		}
		ll l = maxb+1, rt = max(num, maxb+1);

		for(ll i=(l+rt)/2; l<=rt; ) {
			ll tmp = 0;
			for(int j=0; j<l2; j++) {
				tmp *= i;
				tmp += b[j];
			}
			if(tmp == num) {
				cout << i << endl;
				return 0;
			} else if(tmp > num || tmp < 0) {//溢出 
				rt = i-1;
				i = (l+rt)/2;
			} else {
				l = i+1;
				i = (l+rt)/2;
			}
		}
		cout << "Impossible" << endl;

	} else {
		for(int i=0; i<l2; i++) {
			num *= r;
			num += b[i];
		}
		ll l = maxa+1, rt = max(maxa+1, num);
		for(ll i=(l+rt)/2; l<=rt; ) {
			ll tmp = 0;
			for(int j=0; j<l1; j++) {
				tmp *= i;
				tmp += a[j];
			}

			if(tmp == num) {
				cout << i << endl;
				return 0;
			} else if(tmp > num || tmp< 0) {
				rt = i-1;
				i = (l+rt)/2;
			} else {
				l = i+1;
				i = (l+rt)/2;
			}
		}
		cout << "Impossible" << endl;
	}

	return 0;
}

 

//24分  运行超时

 

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
	string n1, n2;

	int tag, r;
	ll maxa=0, maxb=0;

	cin >> n1 >> n2 >> tag >> r;

	if(n1 == n2) {
		cout << r << endl;
		return 0;
	}
	int l1 = n1.length(), l2 = n2.length();

	ll a[l1], b[l2];

	for(int i=0; i<l1; i++) {
		if(n1[i] <= '9' && n1[i] >= '0') {
			a[i] = n1[i]-'0';
		} else a[i] = (n1[i]-'a'+10);
		maxa = max(maxa, a[i]);
	}
	for(int i=0; i<l2; i++) {
		if(n2[i] <= '9' && n2[i] >= '0') {
			b[i] = n2[i]-'0';
		} else b[i] = (n2[i]-'a'+10);
				maxb = max(maxb, b[i]);

	}

	ll num = 0;

	if(tag == 1) {
		for(int i=0; i<l1; i++) {
			num *= r;
			num += a[i];
		}
		if(num == 0 && n2=="0") {
			cout<<"2";
			return 0;
		}
		int lb = max(num, maxb+1); 
		for(int i=maxb+1; i<=lb; i++) {
			ll tmp = 0;
			for(int j=0; j<l2; j++) {
				tmp *= i;
				tmp += b[j];
			}
//			cout << num << ":" << tmp << endl;
			if(tmp == num) {
				cout << i << endl;
				return 0;
			} else if(tmp > num) break;
		}
		cout << "Impossible" << endl;

	} else {
		for(int i=0; i<l2; i++) {
			num *= r;
			num += b[i];
		}
		if(num == 0 && n1=="0") {
			cout<<"2";
			return 0;
		}		
		int lb = max(num, maxa+1); 
		for(int i=maxa+1; i<=lb; i++) {
			ll tmp = 0;
			for(int j=0; j<l1; j++) {
				tmp *= i;
				tmp += a[j];
			}
			if(tmp == num) {
				cout << i << endl;
				return 0;
			} else if(tmp > num) break;
		}
		cout << "Impossible" << endl;
	}

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值