1010 Radix

/题目看起来不难但总是AC不了,看了一些大佬的AC才明白原来是测试的n进制超过了我给的进制最大值,改了之后发现超时,
顺序查找不再满足题目要求,所以用了二分法查找,特别注意的是用了long long后n还是会越界,但是越界后数值n会小于0,
利用这一点来判断是否能找到n使两数相等
/
#include<stdio.h>
#include<math.h>
#include<string.h>
#define M 1000
long long getchar(char a){
long long i;
if((a-‘0’)<10&&(a-‘0’)>=0)
i=a-‘0’;
else
i=(a-‘a’)+10;
return i;
}
long long getnum(char a[],int x){
int i,k=strlen(a);
long long m=0;
for(i=0;i<k;i++)
m+=getchar(a[i])*(long long)pow(x,k-i-1);
return m;
}

long long equal(char a[],char b[],int n){
long long r,A,B,low,high,mid;
int i,k;
A=getnum(a,n);
k=strlen(b);
low=1;
r=-1;
for(i=0;i<k;i++)
if(getchar(b[i])>=low)low=getchar(b[i])+1;
high=A>low?A:low;
while(low<=high){
mid=(low+high)/2;
B=getnum(b,mid);
if(B>A)//||B<0
high=mid-1;
else if(B<A)
low=mid+1;
else{
r=mid;
break;
}
}
return r;
}
int main(){
char a[M],b[M];
int m,n;
scanf("%s %s %d %d",a,b,&m,&n);
long long p;
if(m==1)p=equal(a,b,n);
else p=equal(b,a,n);
if(p!=-1)printf("%lld",p);
else printf(“Impossible”);
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值