《寒假每日一题》2022/1/2 AcWing 2058.笨拙的手指

Posted 白也_y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《寒假每日一题》2022/1/2 AcWing 2058.笨拙的手指相关的知识,希望对你有一定的参考价值。

原题链接:https://www.acwing.com/problem/content/2060/

Problem Description:

奶牛贝茜正在学习如何在不同进制之间转换数字。

但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。

每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的某一位数字写错。

例如,如果她将数字 14 转换为二进制数,那么正确的结果应为 1110,但她可能会写下 0110 或 1111。

贝茜不会额外添加或删除数字,但是可能会由于写错数字的原因,写下包含前导 0 的数字。

给定贝茜将数字 N 转换为二进制数字以及三进制数字的结果,请确定 N 的正确初始值(十进制表示)。

Input:

第一行包含 N 的二进制表示,其中一位是错误的。

第二行包含 N 的三进制表示,其中一位是错误的。

Output:

输出正确的 N 的值。

Sample Input:

1010
212


Sample Output:

14


解题思路:

  • 暴力枚举,将输入的二进制数和三进制数每一位进行改变,然后转为十进制,最后求交集,交集必只有一个数就是结果
  • 跟着y总的思路进行康复训练,企图删除脑子里的大物、概率论、计网

代码讲解:

  • for (auto element : mylist) 冒号的作用为,让容器 mylist 中的数据逐个读取到element中
  • unordered_set<int> S 哈希表
  • ^:异或运算(同为0异为1),二进制每一位上只有0和1 ASCII码分别为48和49,通过异或可以相互转化

AC代码:

#include<bits/stdc++.h>
#include<unordered_set> //哈希表
using namespace std;

int get(string s,int b) //将b进制的数s转为十进制数

        //秦九韶算法
	int res=0;
	for(char c:s)
	    res= res * b + c- \'0\';
	return res; 


int main( )

	string a,b;
	cin>>a>>b;
	
	unordered_set<int>S;
	
	for(char &c:a)  //引用,通过c的改变改变a的值
	
		c^=1;
		S.insert(get(a,2));
		c^=1; 
	
	
	for(char &c:b)
	
		char t=c;
		for(int i=0;i<3;i++) //三进制数每一位有0、1、2三种可能要进行循环判断
		
			if(i-\'0\'!=t) //若与原来该位上的数不同则进行求值、求交集
			
				c=i-\'0\';
				int x=get(b,3);
				if(S.count(x))
				
					cout<<x<<endl;
					return 0; 	
					
			
			c=t;	
		
	
	
	return 0;
 

以上是关于《寒假每日一题》2022/1/2 AcWing 2058.笨拙的手指的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题(入门组)week3 完结

寒假每日一题(入门组)week4 完结

寒假每日一题(入门组)week1 完结

寒假每日一题(入门组)week5 完结

寒假每日一题(提高组)Week 1 完结

AcWing - 蓝桥杯集训每日一题(DAY 1——DAY 5)