PAT甲级1010radix

第一次题解(20分)

#include 
#include
#include
using namespace std;
typedef long long LL;
string N1,N2;
int radix,tag;
LL temp[256];
LL inf=(1LL<<63)-1;
void init(){
    for(char c='0';c<='9';c++){//读入n1 n2;
        temp[c]=c-'0';
    }
    for(char c='a';c<'z';c++){
        temp[c]=c-'a'+10;
    }

}
LL convert(string a,int radix,LL t){//任意进制转换十进制
    LL ans=0;//转换后得数
    int len=a.size();
    for(int i=0;it) return -1;
    }
    return ans;
}
LL find_left(string n){
    int len=n.size();
    int ans=-1;
    for(int i=0;ians)
            ans=temp[n[i]];
    }
    return ans+1;
}
LL cmp(string N2, int radix,LL t){
    int num=convert(N2,radix,t);
    if(num<0) return 1;
     if(num>N1>>N2>>tag>>radix;
    if(tag==2){//保证n1是已知进制的数
        swap(N1,N2);
    }
    LL t=convert(N1,radix,inf);
    LL low=2;
    LL high=max(low,t)+1;
    LL num=find_radix(low,high,N2,t);
    if(num==-1) cout<<"Impossible"<

第二次题解

参考柳神解法和诸多大神题解

#include
#include
#include>
using namespace std;
typedef long long ll;
ll convert(string str,ll radix){
    ll ans=0;
    for(int i=0;i>n1>>n2>>tag>>radix;
	 if(tag==2){
        swap(n1,n2);
	 }
	 a=convert(n1,radix);
	 ll left=0,temp;
	 for(int i=0;ileft) left=temp;
	 }
	 left++;
	 ll right=max(left,a);
	 while(left<=right){
        ll mid=(left+right)/2;
        ll b=convert(n2,mid);
        if(a==b) {
                cout<b) left=mid+1;
	 }
	 cout<<"Impossible";
	return 0;
}

复盘:

1.isdigit函数使用,在algothm头文件下,判断函数,是否是一个数,返回1/0;
2.将未知进制数放在n2,left属于未知进制数所拥有所有数位最大的数。
3.right为(left,n1转换为十进制数)之后的两个数的最大值为什么呢?
考虑n2进制比n1大时,最大进制接近n2本身(举例110 6 1 2)此时left最小进制为7;即为从此最大数为右边界开始寻找。
4.进制转换中,凡是大于以这个数本身的数为基数,最后都等于它本身
*5.不判断溢出会扣10分,溢出可以考虑n<0或者n>inf
*6.在判断n1,n2的相对大小时有一个条件n2<0,这是因为当一个正数在计算机里变成负数时表明这个正数溢出了,至于为什么,需要各位去看看《计算机组成原理》里关于计算机内部码制以及数据在计算机内部的表示方法,这里就不再提及,你只需要知道正数在计算机里变成负数表示这个正数比这种型号的计算机能够表示的最大正数还要大,负数变成正数一样的意思。

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