PAT Clase A 1010Radix

Título:

Dé dos números y dé una base, y pregunte si el otro número es igual al número anterior bajo cierta base.

respuesta:

Debe convertirse a decimal, y luego otro número se convierte a decimal para que cada base se compare con el primer número.

  1. Aunque solo hay 0 ~ 10 y una ~ z en el título, no significa que la base sea solo 36. La base puede ser muy grande y debe dividirse en dos.
  2. El límite izquierdo inicial de la dicotomía es fácil de encontrar y el límite derecho se puede establecer al máximo (límite izquierdo, otro número en decimal)
  3. En el proceso de dicotomía, si la base es demasiado grande, puede causar longlong.Cuando se obtiene un número negativo , significa que la base es demasiado grande en este momento.

De hecho, creo que esta pregunta es muy problemática. No la mencioné en la pregunta, pero casi por defecto que el número con notación hexadecimal no será violento cuando se convierta a decimal. Yo también lo adiviné. Después de hacer esto, realmente no puedo requerir PAT de acuerdo con los estándares de ACM.

Código AC:

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define lep(i,a,b) for(int i=(a);i>=(b);i--) 
#define lepp(i,a,b) for(int i=(a);i>(b);i--)
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp make_pair
#define All(x) x.begin(),x.end() 
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define multi int T;scanf("%d",&T);while(T--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=2e5+5;
const int mod=1e9+7;
const db eps=1e-6;                                                                            
const db pi=acos(-1.0);
string n1,n2;
int tag,radix;
ll num1,num2;
int change(char c){
    if(c>='0'&&c<='9') return c-'0';
    return c-'a'+10;
}
ll cal(string s,int r){
    int l=s.size();
    ll res=0;
    repp(i,0,l){
        res=res*r+change(s[i]);
    }
    return res;
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("D:\\work\\data.in","r",stdin);
    #endif
    cin>>n1>>n2>>tag>>radix;
    if(tag==2) swap(n1,n2);
    num1=cal(n1,radix);
    int l2=n2.size(),minn=0;
    repp(i,0,l2){
        minn=max(minn,change(n2[i]));
    }
    ll l=minn+1,r=max(l,num1);
    while(l<r){
        ll mid=(l+r)>>1;
        num2=cal(n2,mid);
        if(num2<0||num2>=num1) r=mid;
        else l=mid+1;
    }
    if(cal(n2,l)==num1) cout<<l<<endl;
    else cout<<"Impossible"<<endl;
}

Supongo que te gusta

Origin blog.csdn.net/Luowaterbi/article/details/114150529
Recomendado
Clasificación