ZLOJ 进制误转
题目描述
小C学习了进制转换,他写下一个十进制数n,并将其转换到2进制和3进制.
然而转换后的结果里,”正好”有1位出错了.
现在告诉你这两个出了错的结果,请计算原先的n是多少
输入
两个正整数A B,表示2进制下和3进制下的错误结果
输出
一个整数,原来的n
样例输入
1010 212
样例输出
14
提示
n不超过10101010
数据保证有唯一解
这是一道相对经典的题目,涉及到枚举以及回溯。
看到这题会感到无从下手,我原本是打算把那个二进制数和三进制数的可能最小值和可能最大值算出来,再在这个范围内一个整数一个整数枚举。
改进后的代码大体思路是,把两个数的可能错误位和可能错误值枚举,范围不大,再将枚举中的数转化成十进制数比较,如果相等,这个就是答案。
#include<bits/stdc++.h>
using namespace std;
long long conversion(string a,int b){
int temp=0,j=0;
for(int i=a.length()-1;i>=0;i--)
temp+=(a[i]-'0')*pow(b,j++);
return temp;
}//Quality testing No.1 yes;
string B,C;
int main(){
cin>>B>>C;
for(int i=0;i<B.length();i++){
if(B[i]=='0')
B[i]='1';
else B[i]='0';
int temp=conversion(B,2);
for(int j='0';j<='2';j++)//枚举三进制数可能错误值
for(int k=0;k<C.length();k++){//枚举三进制数可能错误位
char tem=C[k];
if(C[k]!=j)
C[k]=j;
if(conversion(C,3)==temp){//比较过程
cout<<temp;
return 0;
}
C[k]=tem;//回溯过程
}
if(B[i]=='0')
B[i]='1';
else B[i]='0';//回溯过程
}
return 0;
}