1010 Radix (25 分)

二分实测,存在输入样例:193602   3102  1  10 (测试点3,4)

存在输入样例:6   110  2  2 (测试点1)

需要注意题目没有说明最大的进制是36以内的,而Java中BigIntege(x,radix)中 radix的范围被限定在36内,故无法使用这个方法进行进制转换

以下是C++代码,样例7没过,存疑,猜测应该是进制过大,long long溢出了,但改了溢出判断也还是WA了,还麻烦知道的同学指点一下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 
ll convert(string a,int radix)
{	
	ll ans=0;
	for(int i=0;i<a.length();i++)
	{

		ans*=radix;
		ans+=isdigit(a[i])? a[i]-'0':a[i]-'a'+10;
	}
	return ans ;
}
int find_min(string n)
{
	char it = *max_element(n.begin(), n.end());
	return (isdigit(it)? it-'0':it-'a'+10)+1;
} 
int main()
{	
	string N1,N2;
	int tag,radix;
	cin>>N1>>N2>>tag>>radix;
	string N3=(tag==1 ? N1:N2);             //N是radix进制的一个数 
	ll N3_num=convert(N3,radix);
	string N4=(tag==2 ? N1:N2);             //某个进制的N4,要与N3比较
	ll N4_num=convert(N4,radix);
	//比较方法:将N4转换为10进制,将N3转换为10进制 
	ll low=find_min(N4);
	ll high;
	if(N4_num<10) high=low;               //此处上限设置出问题,导致样例7过不了 
	else high=50;                       
	while(low<=high)
	{	

		int mid=(low+high)/2; 
		if(convert(N4,mid)==N3_num)
		{	
			cout<<mid;
			return 0;
		}
		else if(convert(N4,mid)<N3_num) low=mid+1;
		else high=mid-1;
	}
		cout<<"Impossible";
}

新知识:

1、字符串中取出asc码最大的一个字符 char it = *max_element(n.begin(), n.end());

2、isdigit()的使用 返回true表示是数字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值