PAT甲级——1010 Radix (25分)【22分未AC】

这道题有坑啊!注意题目没有说最大多少位,可能会很大,所以搜索的时候不能用顺序搜索

因为是有顺序的,明显是用二分搜索!

一开始顺序搜索能拿22分:

//1010
/*
6 110 1 10
1 ab 1 2
*/
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;

int change(char x[],ll d){//将d进制的数x转换成十进制
    int i=0;
    while(x[i]!='\0'){
        i++;
    }
    int r=0;
    for(int j=i-1;j>=0;j--){
        if(x[j]<='z'&&x[j]>='a'){
            r+=((x[j]-'a'+10)*pow(d,i-j-1));
        }else{
            r+=((x[j]-'0')*pow(d,i-j-1));
        }
    }
    return r;
}

int main(){
    cout<<(1<<31);
    char x[100]={0},y[100]={0};
    ll tag,radix;
    cin>>x>>y>>tag>>radix;
    int x1,y1;
    bool flag = false;
//    cout<<change(y,10)<<endl;
    if(tag==1){
        x1 = change(x,radix);
        for(int i=1;i<=10000;i++){
            if(change(y,i)==x1){
                cout<<i<<endl;
                flag = true;
                break;
            }
        }
    }else{
        y1 = change(y,radix);
        for(int i=1;i<=10000;i++){
            if(change(x,i)==y1){
                cout<<i<<endl;
                flag=true;
                break;
            }
        }
    }
    if(!flag){
        cout<<"Impossible"<<endl;
    }
    

    return 0;
}

提示是答案错误,不是超时;感觉不像是没用二分的二分的问题

看网上其他人的,我还是用二分重写了一下:

//1010二分
/*
6 110 1 10
1 ab 1 2
*/
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef unsigned long long ll;
static const ll MAX = (1000);
 
ll change(char x[],ll d){//将d进制的数x转换成十进制
    int i=0;
    while(x[i]!='\0'){
        i++;
    }
    ll r=0;
    for(int j=i-1;j>=0;j--){
        if(x[j]<='z'&&x[j]>='a'){
            r+=((x[j]-'a'+10)*pow(d,i-j-1));
        }else{
            r+=((x[j]-'0')*pow(d,i-j-1));
        }
    }
    return r;
}
 
ll find(ll a,char x[]){//二分查找,如果不存在则返回-1
    ll left = 0;
    ll right = a+1;
    ll mid;
    while(left<=right){
        mid = (left+right)/2;
        if(a==change(x,mid))
            return mid;
        else if(a>change(x,mid)){//搜索后半部分
            left = mid+1;
        }else{//搜索前半部分
            right = mid-1;
        }
    }
    return -1;
}
 
int main(){
 
    char x[MAX]={0},y[MAX]={0};
    ll tag,radix;
    cin>>x>>y>>tag>>radix;
    ll x1,y1;
    if(tag==1){
        x1 = change(x,radix);
        if(find(x1,y)==-1){
            cout<<"Impossible"<<endl;
        }else{
            cout<<find(x1,y)<<endl;
        }
    }else{
        y1 = change(y,radix);
        if(find(y1,x)==-1){
            cout<<"Impossible"<<endl;
        }else{
            cout<<find(y1,x)<<endl;
        }
    }
 
    return 0;
}

结果拿到的分更少了

我去牛客上看一下测试点:

最大的28031959,窝里个去……

写这么大又会内存超限,换unsigned long long 都不行

服了

先睡觉去了,明天再看。。

发布了298 篇原创文章 · 获赞 301 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104384839