A1010——Radix(好多测试点…)

一开始只能过两个测试点,研究了半天还是不会,然后对着算法笔记抄了一遍,然而!不知道为啥还是没过,暴风哭泣[还核对了好几遍呢]

最后还是借鉴下一些坑点的操作,乖乖改自己的代码!我能说这题我做了快4h吗使用map的代码

坑点:

①数据有可能会大到溢出,这时候就跟n2>n1的情况一样做left=mid+1,注意判断即可;

②二分搜索时left为n2各位数中的最大数+1,right为max(left,n1)+1

③记得用longlong类型,以及一些小错误(如果你不知道哪里错了的话,就检查下变量初始化、条件语句等)

直接上代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long LL;
LL inf=(1LL << 63)-1;            //longlong的上限,这里参考算法笔记

int Getmax(char s[]){            //取各位数中最大的值
    int len=strlen(s);
    long long temp=0,maxo=0;
    for(int i=0;i<len;i++){
        if(s[i]<='9'&&s[i]>='0'){
            temp=s[i]-'0';
        }else if(s[i]<='z'&&s[i]>='a'){
            temp=s[i]-'a'+10;
        }
        if(maxo<temp) maxo=temp;
    }
    return maxo+1;
}

long long T(char num[],long long d1){       //把字符串转化成d1进制数(二分查找时会用到)
    long long sum=0;
    int len=strlen(num);
    long long temp=0;
    for(int i=0;i<len;i++){
        if(num[i]<='9'&&num[i]>='0'){
            temp=(num[i]-'0');
        }else if(num[i]<='z'&&num[i]>='a'){
            temp=(num[i]-'a'+10);
        }
        sum=d1*sum+temp;
    }
    if(sum<0||sum>inf){
        return -1;
    }else{
         return sum;
}
}

long long Num(char a[]){        //把字符串转化成数值(个人偏好,可以不写这个函数)
    int len=strlen(a);
    long long total=0;
    for(int i=0;i<len;i++){
        if(a[i]<='9'&&a[i]>='0'){
            total=total*10+(a[i]-'0');
        }
        if(a[i]<='z'&&a[i]>='a'){
            total=total*10+(a[i]-'a'+10);
        }
    }
    return total;
}


int main(){
    long long n1,n2,temp;
    char s1[20],s2[20],ts[20];
    long long tag,radix;
    scanf("%s%s%lld%lld",s1,s2,&tag,&radix);
    if(tag==2){                 //radix如果不是n1的基数,则交换n1和n2
        strcpy(ts,s1);
        strcpy(s1,s2);
        strcpy(s2,ts);
    }
    n1=T(s1,radix);
    long long left=Getmax(s2),right=0,mid=0;
    right=max(left,n1)+1;
    while(left<=right){
            mid=(left+right)/2;
            temp=T(s2,mid);

            if(temp>n1||temp==-1){  //就是这里得条件顺序!!终于找到错误点了
                right=mid-1;
            }else{
              if(temp<n1){
                left=mid+1;
             }
            }
           if(temp==n1) break;
        }

        if(temp!=n1){
                printf("Impossible");
        }else{
                printf("%lld",mid);
            }

return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值