AcWing打卡-2058-笨拙的手指

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了AcWing打卡-2058-笨拙的手指脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

2058.笨拙的手指


AcWing打卡-2058-笨拙的手指


tags(位运算,暴力)

题目提到了给定的两个数都只有一位错了,那么我们可以枚举这两个数在不同位错了的情况,若改正后,即(str_a[i])(str_b[j])分别转换后变为(sum_a = sum_b),则说明此时即是我们要找的正确结果,输出即可。

于是可以嵌套两层循环,分别枚举两个给定字符的每一位即可。

这里枚举要注意,对于(2)进制,非(0)(1),所以比较好枚举,而对于(3)进制,则需要枚举其他的两种情况。

以下代码参考了大佬的解法,使用(ra[i] text{^}=1)

因为字符('1')(ascii)码对应的二进制为(11,0001),字符('0')对应的(ascii)码为(11,0000)。与(1)异或正好可以使得(0 rightarrow1)(1rightarrow0)

对于(3)进制,若为(k),即跳过错误的,尝试其他的(2)种是否可以满足。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a, b;
    cin >> a >> b;
    for (int i = 0; i < a.size(); i++)
    {
        for (int j = 0; j < b.size(); j++)
        {
            for (char k = '0'; k <= '2'; k++)
            {
                string ra = a;
                ra[i] ^= 1;
                string rb = b;
                if (b[j] == k)
                {
                    continue;
                }
                rb[j] = k;
                int x = 0, y = 0;
                for (int i = 0; i < ra.size(); i++)
                {
                    x = x * 2 + ra[i] - '0';
                }
                for (int i = 0; i < rb.size(); i++)
                {
                    y = y * 3 + rb[i] - '0';
                }
                if (x == y)
                {
                    printf("%dn", x);
                }
            }
        }
    }
    return 0;
}

Java:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a, b;
        a = in.nextLine();
        b = in.nextLine();
        for(int i = 0; i < a.length(); i++) {
            for(int j = 0; j < b.length(); j++) {
                for(char k = '0'; k <= '2'; k++) {
                    char[] ra = a.toCharArray();
                    ra[i] ^= 1;
                    char[] rb = b.toCharArray(); 
                    if(b.charAt(j) == k ) {
                        continue;
                    } else {
                        rb[j] = k;
                    }
                    int x = 0, y = 0;
                    for(int l = 0; l < ra.length; l++) {
                        x = x * 2 + ra[l] - '0'; 
                    }
                    for(int l = 0; l < rb.length; l++) {
                        y = y * 3 + rb[l] - '0';
                    }
                    if(x == y) {
                        System.out.println(x);
                    }
                }
            }
        }
    } 
}

脚本宝典总结

以上是脚本宝典为你收集整理的AcWing打卡-2058-笨拙的手指全部内容,希望文章能够帮你解决AcWing打卡-2058-笨拙的手指所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: