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

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

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

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

//1010
/*
6 110 1 10
1 ab 1 2
*/
#include 
#include 
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<

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

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

//1010二分
/*
6 110 1 10
1 ab 1 2
*/
#include 
#include 
#include 
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"<

结果拿到的分更少了

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

最大的28031959,窝里个去……

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

服了

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

 

你可能感兴趣的:(PAT甲级)