2022AcWing寒假算法每日一题之2058. 笨拙的手指
题目链接:AcWing2058. 笨拙的手指
思路:
1.数据范围为0~1e9,则输入的时候按照字符串输入
2.将二进制和三进制各位数上的数字分别存入数组中并记录数组的长度,便于后续求原来的值
3.多重循环,分别改变各位数上的数字,判断二进制数与三进制数是否相等。
细节:在二进制位上的数改变的时候,可以采用异或1的方式进行,因为11=0,01=1;
具体代码如下:
#include <iostream>
#include <math.h>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const ll N = 1e6+10;
ll t[N];
ll two[N];
ll three[N];
int main()
{
string a,b;
cin>>a>>b;
ll l1 = 0,l2 = 0;
for(ll i=a.size()-1;i>=0;i--)
{
two[++l1]=a[i]-'0';//将二进制数字倒序存入数组
}
for(ll i=b.size()-1;i>=0;i--)
{
three[++l2]=b[i]-'0';//将三进制数字倒序存入数组
}
for(ll i=1;i<=l1;i++)
{
two[i]=two[i]^1;//利用异或1改变数字,0->1,1->0
for(ll j=1;j<=l2;j++)
{
for(int k=0;k<=2;k++)
{
if(three[j]==k)continue;//如果是相同的数字,则不发生改变
ll three1 = three[j];//暂存该位数上的数字
three[j]=k;//改变位数上的数字
ll sum1 = 0,sum2 = 0;
for(ll r=1;r<=l1;r++)sum1+=two[r]*pow(2, r-1);//计算二进制代表的数
for(ll r=1;r<=l2;r++)sum2+=three[r]*pow(3, r-1);//计算三进制代表的数
if(sum1==sum2)//如果相等,则直接输出,结束程序
{
cout<<sum1<<endl;
return 0;
}
three[j]=three1;//还原
}
}
two[i]=two[i]^1;//还原
}
return 0;
}