1. 程式人生 > >洛谷 P1555 尷尬的數字

洛谷 P1555 尷尬的數字

ostream radius 學會 img pos https post void content

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

洛谷 P1555 尷尬的數字