pat-1010

#include<bits/stdc++.h>
using namespace std;
long long convert(string a,long long int radix){
	long long int sum=0;
	int cnt=0,temp=0; 
	for(int i=a.size()-1;i>=0;i--){
		//int cnt=0;  位置放错   除非条件重置crt  以后声明全部放在外面,条件需要重置值时放在里面,不能哪用到在哪声明容易  出错 
		temp=isdigit(a[i])? a[i]-'0':a[i]-'a'+10;
		sum+=temp*pow(radix,cnt++); 
	}
	return sum;
}
long long int findr(string a,long long b){
	//该数的进制下限是数中数位的最大值+1
	char temp=*max_element(a.begin(),a.end());
	//long long int low=isdigit(temp)?temp-'0'+1:temp-'a'+10+1 ;//为什么需要加括号?  如果不加括号他会把后面那一块看成一部分,导致他为数 时没有+1,我想表达的是不论是数还是字母都应该加1 
	long long int low=(isdigit(temp)?temp-'0':temp-'a'+10) +1 ;
	long long int high=max(low,b);
	long long _1,mid;
	while(low<=high){//可以等于 
		 mid=(low+high)/2;
		_1=convert(a,mid);
		if(_1>b||_1<0){//溢出会溢成负的 
	    high=mid-1; 
		}
		else if(_1==b) return mid;
		else low=mid+1; 
	}
	return -1;//没有就return -1 
}
int main(){
	long long tag,_3;
	char _1[50],_2[50];
	scanf("%s %s %lld %lld",&_1,&_2,&tag,&_3);
	long long _4=tag==1?convert(_1,_3):convert(_2,_3);
	long long _5;
	if(tag==1)
	 _5=findr(_2,_4);
	else 
     _5=findr(_1,_4);
	if(_5==-1) printf("Impossible");
	else printf("%d",_5);
	return 0;
} 

总结

1.进制最小值是 输入数位中,最大的值加一,由于isdigit,如果不加括号,他就会把后面的看做一部分,导致我前面那部分没加一,本来应该是不管哪种情况,最后都要加一,因为我的划分错误,导致没有实现想法

2.要用long long 而且在数制转换时,有可能溢出为负  正正   负 不能漏判

3.二分法while (<=)等号不能丢,因为里面更新时直接减一,是闭区间,如果不带等号会少算一个值

4.之后只要不是条件重置crt  声明都放外边  

英语

 

问题

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值