PAT 甲级(A Level)题< A1010 Radix > 15分到25分之路

A1010 Radix 传送门
这题卡了好几天, 感觉算法笔记给的基础1-6章里,有很多劝退题啊.
历经千辛万苦终于搞对了这题
献上AC代码

#include<bits/stdc++.h>

#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int MAX = 2e6+7;
string n1,n2;
ll tag,radix;
ll num1;
ll Max = ((ll)1<<63)-1;
ll getNum(char c){
	if(c>='0' && c<='9') return c-'0';
	else if(c>='a' && c <='z') return c-'a'+10;
	else return -1;
}
ll r2d(string str, ll radix){
	int len = str.length();
	ll ans=0;
	for(int i=0; i< len; i++){
		ll num = getNum(str[i]);
		ans = ans * radix + num;
	}
	return ans;
}
ll getLeft(string str){
	ll Max = 0;
	for(int i=0; i<str.length(); i++){
		ll num = getNum(str[i]);
		if(num > Max) Max = num;
	}
	return Max+1;
}
void solve(string str){/* 看这里面!!!*/
	int flag = 0;
	ll left = getLeft(str);
	ll right = max(left, num1)+1;
	ll mid;
	while(left <= right) {
		mid = (left + right) / 2;
		ll num2 = r2d(str, mid);
		if(num2 == num1) {
			flag = 1;
			break;
		} else if(num2 <0 /* 看这里!!!*/|| num2 > num1) {/* 看这里!!!*/
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	if(flag) {
		cout << mid;
	} else printf("Impossible");

}
int main(void){
	FAST;
	cin >> n1 >> n2 >> tag >> radix;
	if(tag==2) {
        string tmp = n1;
        n1 = n2;
        n2 = tmp;
	}
	num1 = r2d(n1,radix);
    solve(n2);/* 看这个函数里面!!!*/

}

在这里插入图片描述

给大家看看我n个15分的代码

#include<bits/stdc++.h>

#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int MAX = 2e6+7;
string n1,n2;
ll tag,radix;
ll num1;
ll Max = ((ll)1<<63)-1;
ll getNum(char c){
	if(c>='0' && c<='9') return c-'0';
	else if(c>='a' && c <='z') return c-'a'+10;
	else return -1;
}
ll r2d(string str, ll radix){
	int len = str.length();
	ll ans=0;
	for(int i=0; i< len; i++){
		ll num = getNum(str[i]);
		ans = ans * radix + num;
	}
	return ans;
}
ll getLeft(string str){
	ll Max = 0;
	for(int i=0; i<str.length(); i++){
		ll num = getNum(str[i]);
		if(num > Max) Max = num;
	}
	return Max+1;
}
void solve(string str){/* 看这里!!!*/
	int flag = 0;
	ll left = getLeft(str);
	ll right = max(left, num1)+1;
	ll mid;
	while(left <= right) {
		mid = (left + right) / 2;
		ll num2 = r2d(str, mid);
		if(num2 == num1) {
			flag = 1;
			break;
		} else if(/* 看这里!!!*/num2 > num1) { /* 看这里!!!*/
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	if(flag) {
		cout << mid;
	} else printf("Impossible");

}
int main(void){
	FAST;
	cin >> n1 >> n2 >> tag >> radix;
	if(tag==2) {
        string tmp = n1;
        n1 = n2;
        n2 = tmp;
	}
	num1 = r2d(n1,radix);
    solve(n2);/* 看这里!!!*/

}

有什么区别呢?
关键在于solve 的 二分查找如果ll 溢出 会显示负值, 那么我们也知道这是一个很大数(比longlong)大, 所以查找条件要添加 < 的判断啊,mmp.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值