• 进制转换的题解


    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;
    }
    

  • 相关阅读:
    Linux下的输入/输出重定向
    strcpy与strncpy的区别
    C++的函数重载
    gtest 学习二
    gtest 学习一
    char* wchar* char wchar转换
    iconv 编译不通过问题
    嵌入式常用库
    驱动编程class_create说明
    libiconv 交叉编译
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12816978.html
Copyright © 2020-2023  润新知