笨拙的手指——acwing算法题第一天

简介: 笨拙的手指——acwing算法题第一天

笨拙的手指

在这里插入图片描述
在这里插入图片描述

方法一

用暴力枚举法枚举出二进制所有的情况,化为十进制数存放在一个数组中,
然后再去枚举三进制所有的情况,化为十进制一一去和数组中的元素去匹配,如果相等就说明找到了答案,结束程序

1.将m进制的数转为十进制

int get(char* a, int m)
{
    
    int ret = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++)
    {
    
        ret = ret * m + (a[i]-'0');
    }
    return ret;
}

2.去数组中找相等的数

int find(int* arr, int a,int len1)
{
    

    for (int i = 0; i < len1; i++)
    {
    
        if (a == arr[i])
            return 1;

    }
    return 0;
}

3.完整代码

#include
#include
#include
int get(char* a, int m)
{
    
    int ret = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++)
    {
    
        ret = ret * m + (a[i]-'0');
    }
    return ret;
}
int find(int* arr, int a,int len1)
{
    

    for (int i = 0; i < len1; i++)
    {
    
        if (a == arr[i])
            return 1;

    }
    return 0;
}
int main()
{
    

    char a[11], b[11];
    scanf("%s", a);
    scanf("%s", b);
    int len1 = strlen(a);
    int len2 = strlen(b);
    int* ret1 = (int*)malloc(sizeof(int) * len1);
    for (int i = 0; i < len1; i++)
    {
    
        a[i] ^= 1;
        ret1[i] = get(a, 2);
        a[i] ^= 1;
    }
    int p = 0;
    for (int i = 0; i < len2; i++)
    {
    
        char t = b[i];
        for (int j = 0; j < 3; j++)
        {
    
            b[i] = j + '0';
            int c = get(b, 3);
            if (find(ret1, c,len1) == 1)
            {
    
                printf("%d",c);
                return 0;
            }
            b[i] = t;
        }
    }
    return 0;
}

方法二

枚举二进制的所有情况,化为三进制后,去和b比较,假如仅有一位不相同,则说明该情况就是正确答案,程序结束

  1. 二进制转化为十进制
int get(char* a, int m)
{
    
    int ret = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++)
    {
    
        ret = ret * m + (a[i] - '0');
    }
    return ret;
}

2.二进制转化为三进制

char* cp(char* a, int m)
{
    
    char* arr = (char*)malloc(sizeof(char) * 10);
    int temp = get(a, m);
    int i = 0;
    while (temp)
    {
    
        arr[i] = temp % 3 + '0';
        temp /= 3;
        i++;
    }
    arr[i] = '\0';
    for (int j = 0; j < i / 2; j++)
    {
    
        char t = arr[j];
        arr[j] = arr[i - j - 1];
        arr[i - j - 1] = t;
    }
    return arr;
}

3.统计每位不一样的个数

int count(char* a, char* b)
{
    
    int len1 = strlen(a);
    int len2 = strlen(b);
    if (len1 != len2)
        return 0;
    int count = 0;
    while (len2 >= 0 && len1 >= 0)
    {
    
        if (a[len1] != b[len2])
            count++;
        len1--;
        len2--;
    }
    return count;
}

4.完整代码

#include
#include
#include
//二转十
int get(char* a, int m)
{
    
    int ret = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++)
    {
    
        ret = ret * m + (a[i] - '0');
    }
    return ret;
}
//二转三
char* cp(char* a, int m)
{
    
    char* arr = (char*)malloc(sizeof(char) * 10);
    int temp = get(a, m);
    int i = 0;
    while (temp)
    {
    
        arr[i] = temp % 3 + '0';
        temp /= 3;
        i++;
    }
    arr[i] = '\0';
    for (int j = 0; j < i / 2; j++)
    {
    
        char t = arr[j];
        arr[j] = arr[i - j - 1];
        arr[i - j - 1] = t;
    }
    return arr;
}
int count(char* a, char* b)
{
    
    int len1 = strlen(a);
    int len2 = strlen(b);
    if (len1 != len2)
        return 0;
    int count = 0;
    while (len2 >= 0 && len1 >= 0)
    {
    
        if (a[len1] != b[len2])
            count++;
        len1--;
        len2--;
    }
    return count;
}
int main()
{
    
    char a[30], b[30];
    scanf("%s", a);
    scanf("%s", b);
    int len1 = strlen(a);
    int len2 = strlen(b);
    int* ret1 = (int*)malloc(sizeof(int) * len1);
    for (int i = 0; i < len1; i++)
    {
    
        a[i] ^= 1;
        int t = count(b, cp(a, 2));
        if (t == 1)
        {
    
            printf("%d", get(a, 2));
            return 0;
        }
        a[i] ^= 1;
    }
}
相关文章
|
4月前
|
算法
双指针算法(acwing)疑难讲解
双指针算法(acwing)疑难讲解
34 0
|
10月前
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(3)
当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。
94 0
|
10月前
|
存储 人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(3)
根据下面公式来预处理出等式右边的组合数的值,那么等式左边就可以用等式右边已经算过的值来进行计算(有点像dp)。
74 0
|
10月前
|
人工智能 算法 BI
【AcWing算法基础课】第四章 数学知识(未完待续)(2)
从2到n枚举每个数,删掉其所有的倍数,枚举完之后,没有被删掉的数为质数。
82 0
|
3月前
|
存储 人工智能 算法
程序与技术分享:Acwing算法笔记
程序与技术分享:Acwing算法笔记
|
4月前
|
存储 算法 安全
C# | 上位机开发新手指南(五)校验算法——CRC
当我们在进行数据传输时,可能会因为信道噪声、干扰等因素导致数据出现错误,从而影响传输的可靠性和准确性。此时,我们需要一种方法来检测数据是否出现错误,并尽可能快速地发现和纠正错误。CRC(Cyclic Redundancy Check)校验算法就是一种常用的数据校验方法,它通过对数据进行处理生成校验码,从而实现对数据的完整性和准确性进行验证。 使用CRC校验的意义在于能够提高数据传输的可靠性,降低数据传输错误率,确保数据的完整性和准确性。在各个领域中,如通信、网络、存储等,CRC校验都得到了广泛的应用。
226 0
C# | 上位机开发新手指南(五)校验算法——CRC
|
4月前
|
算法 C#
C# | 上位机开发新手指南(四)校验算法
校验算法是一种用于验证数据传输过程中是否出现错误或丢失的算法。 在数据传输过程中,由于噪声、干扰、传输错误等因素的影响,会导致数据传输过程中出现错误或丢失。 为了保证数据传输的准确性,需要在数据传输过程中添加校验码。发送端通过计算数据的校验码并将其附加到数据中一起发送出去,接收端再次计算校验码并将其与接收到的校验码进行比较,如果两者相同,则说明数据传输过程中没有出现错误或丢失。
210 0
C# | 上位机开发新手指南(四)校验算法
|
10月前
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且 总价值最大 。
58 0
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
|
10月前
|
算法 存储 内存技术
【AcWing算法基础课】第三章 搜索与图论(3)
特点:尽可能先向纵深方向搜索。使用stack实现。所需空间O(h)(h为深度)。不具有“最短性”。
99 0
【AcWing算法基础课】第三章 搜索与图论(3)
|
10月前
|
人工智能 算法 JavaScript
【AcWing算法基础课】第五章 动态规划(未完待续)(2)
给定一个如下图所示的数字三角形,从 顶部 出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点, 一直走到底层 ,要求找出一条路径,使 路径上的数字的和最大。
51 0