洛谷 P1555 尴尬的数字
题目背景
Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔。
题目描述
每当Bessie将一个数转换成新的进制时,她总会写错一位数字。例如,她将14转化成2进制数,正确的结果是"1110",但她可能会写成"0110"或"1111"。Bessie从不会意外的增加或删减数字,所以她可能会写出以"0"开头的错误数字。
给出Bessie转换后N的2进制形式和3进制形式,请计算出N的正确数值(用十进制表示)。N可能会达到10亿,输入数据保证解的存在唯一性。
输入输出格式
输入格式:
第一行,N的2进制表示(有一位是错误的数字)
第二行,N的3进制表示(有一位是错误的数字)
输出格式:
N的正确值
输入输出样例
输入样例#1: 复制
1010
212
输出样例#1: 复制
14
思路:爆搜可过。
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int len1,len2; long long sum1; char s1[10000],s2[10000]; int num1[10000],num2[10000]; void dfs(long long num,int tot,int pos){ if(tot==len2){ if(sum1==num){ cout<<sum1; exit(0); } return ; } if(pos) dfs(num+num2[tot]*pow(3,tot),tot+1,pos); else{ if(num2[tot]!=0&&tot!=len2-1) dfs(num,tot+1,1); else dfs(num,tot+1,pos); if(num2[tot]!=1) dfs(num+pow(3,tot),tot+1,1); else dfs(num+pow(3,tot),tot+1,pos); if(num2[tot]!=2) dfs(num+2*pow(3,tot),tot+1,1); else dfs(num+2*pow(3,tot),tot+1,pos); } } int main(){ scanf("%s",s1);scanf("%s",s2); len1=strlen(s1); len2=strlen(s2); if(s1[0]=='0'){ for(int i=0;i<len1;i++) sum1+=pow(2,i)*(s1[len1-1-i]-'0'); long long x=pow(2,len1-1); cout<<sum1+x; return 0; } if(s2[0]=='0'){ for(int i=0;i<len2;i++) sum1+=pow(3,i)*(s2[len2-1-i]-'0'); long long x=pow(3,len2-1); cout<<sum1+x; return 0; } for(int i=0;i<len1;i++) num1[i]=s1[len1-1-i]-'0'; for(int i=0;i<len2;i++) num2[i]=s2[len2-1-i]-'0'; for(int i=0;i<len1;i++) sum1+=pow(2,i)*num1[i]; for(int i=0;i<len1;i++){ if(num1[i]&&i!=len1-1) sum1-=pow(2,i); else sum1+=pow(2,i); dfs(0,0,0); if(num1[i]&&i!=len1-1) sum1+=pow(2,i); else sum1-=pow(2,i); } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。