进制转换的题解

6×9=426×9=42 在十进制下是不成立的,但在 1313 进制下是成立的,因为 42(13)=4×13+2=54(10)42(13)=4 imes13+2=54(10)
现给出三个正整数 p,q,rp, q, r,请求出最小的进制 B(2B16)B(2leq Bleq16) 满足 p×q=rp imes q=rBB 进制下成立。
如果不存在满足条件的 BB 则输出 0。注意 BB 进制数的每一位均小于 BB

我傻,傻乎乎地写高精,只不过调得还满快的

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string p,q,r;
int x[1010],a[1010],b[1010];
char work(int x){
	if(x<=9)return char(x+48);
	return char(x+55);
}
int work2(char x){
	if(isdigit(x))return x-48;
	return x-55;
}
string jf(string st1,string st2,int t){
	memset(x,0,sizeof(x));
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
    string ans="";
    int k=-1,f=0,la,lb;
    for(int i=st1.size()-1;i>=0;i--){
        k++;
        a[k]=st1[i]-48;
    }la=st1.size();
    k=-1;
    for(int i=st2.size()-1;i>=0;i--){
        k++;
        b[k]=st2[i]-48;
    }lb=st2.size();
    for(int i=0;i<la;i++)
        for(int j=0;j<lb;j++)
            x[i+j]=x[i+j]+a[i]*b[j];
    for(int i=0;i<1000;i++){
        x[i+1]=x[i+1]+x[i]/t;
        x[i]=x[i]%t;
    }
    for(int i=1000;i>=0;i--)
        if(f)ans=ans+work(x[i]);
        else if(x[i]!=0){
                ans=ans+work(x[i]);
                f=1;
            }
    if(f==0)ans=ans+'0';
    return ans;
}
bool check(int x){
	if(jf(p,q,x)==r)return true;
	return false;
}
int main(){
	cin>>p>>q>>r;
	for(int i=2;i<=16;i++)
		if(check(i)){
			cout<<i;
			return 0;
		}
	cout<<0;
	return 0;
}

实际上,可以把 pqr 都转成 10 进制,看合不合法。

#include <bits/stdc++.h>
using namespace std;
int work(int x,string st){
	int ans=0;
    for(int i=0;i<st.size();i++)
    	if(st[i]-'0'>=x)return 0;//判断是否合法
        ans=ans*x+st[i]-'0';
    }return ans;
}
int main(){
	string p,q,r;
	cin>>p>>q>>r;
	for(int i=2;i<=16;i++){
		int p2=work(i,p),q2=work(i,q),r2=work(i,r);
		if(p2*q2==r2){
			cout<<i<<endl;
			return 0;
		}
	}puts("0");
	return 0;
}

原文地址:https://www.cnblogs.com/zhaohaikun/p/12816978.html