A-A+

用C++ 写一个映射函数 使数字对应字符 实现加解密

2023年02月21日 21:33 学习笔记 暂无评论 共5938字 (阅读544 views次)

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

直接给数字映射成字符串的函数(类似于加密函数):

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string int_to_string(int num) {
    string result;
    vector<string> chars = {"b", "r", "0", "o", "/", "w", "u", "a", "9", "x"};

    while (num > 0) {
        int digit = num % 10;
        result = chars[digit] + result;
        num /= 10;
    }

    if (result.empty()) {
        result = "0";
    }

    return result;
}

int main() {
    int num = 241;
    string str = int_to_string(num);
    cout << str << endl;
    return 0;
}

 
 
直接给字符串映射成数字的函数(类似于解密函数),与上方的函数正好相反:
 

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int string_to_int(const string& str) {
    char digits[] = {'b', 'r', '0', 'o', '/', 'w', 'u', 'a', '9', 'x'};
    int lookup[128] = {0}; // ASCII 码表共有 128 个字符
    for (int i = 0; i < 10; i++) {
        lookup[digits[i]] = i;
    }

    int result = 0;
    for (char c : str) {
        if (lookup[c] == 0 && c != '0') {
            // 如果字符不在映射表中,返回错误代码
            return -1;
        }
        result = result * 10 + lookup[c];
    }

    return result;
}

int main() {
    string str = "laskdjfAsdklfj234";
    int num = string_to_int(str);
    if (num == -1) {
        cout << "Error: Input string contains invalid characters." << endl;
    } else {
        cout << num << endl;
    }
    return 0;
}

 
===========================================================================
 
上述代码是由openAI人工智能写出的代码,具体训练它写的过程如下:
用C语言写一个函数,函数的主要目的是输入整数输出字符串,要求1、2、3、4、5、6、7、8、9、0对应b、r、0、o、\、w、u、a、9、x,例如输入241,函数会返回rob
 

//下面是用C语言编写的函数,它将一个整数转换为对应的字符串:
#include <stdio.h>
#include <stdlib.h>

char* int_to_string(int num) {
    char* result = malloc(32); // 分配足够的内存空间
    int len = 0; // 字符串长度

    // 数字对应的字符数组
    char* chars[] = {"b", "r", "0", "o", "\\", "w", "u", "a", "9", "x"};

    while (num > 0) {
        int digit = num % 10;
        result[len++] = chars[digit][0]; // 将字符添加到结果字符串中
        num /= 10;
    }

    // 如果输入的数是0,则将结果字符串设为"0"
    if (len == 0) {
        result[len++] = '0';
    }

    // 反转字符串
    for (int i = 0; i < len / 2; i++) {
        char temp = result[i];
        result[i] = result[len - i - 1];
        result[len - i - 1] = temp;
    }

    // 在字符串末尾添加空字符
    result[len] = '\0';

    return result;
}

int main() {
    int num = 241;
    char* str = int_to_string(num);
    printf("%s\n", str);
    free(str);
    return 0;
}
//函数使用了一个字符数组chars,其中存储了0-9每个数字对应的字符。在主循环中,函数不断地将输入的数字除以10,然后将余数转换为对应的字符,将这些字符按顺序添加到结果字符串的开头。最后,函数反转结果字符串,将其转换为正确的顺序,并在字符串末尾添加空字符。

 
 
更换一下刚刚对应的字符串,其中的\换成/
 

//下面是将反斜杠\更换为正斜杠/的函数代码:
#include <stdio.h>
#include <stdlib.h>

char* int_to_string(int num) {
    char* result = malloc(32); // 分配足够的内存空间
    int len = 0; // 字符串长度

    // 数字对应的字符数组
    char* chars[] = {"b", "r", "0", "o", "/", "w", "u", "a", "9", "x"};

    while (num > 0) {
        int digit = num % 10;
        result[len++] = chars[digit][0]; // 将字符添加到结果字符串中
        num /= 10;
    }

    // 如果输入的数是0,则将结果字符串设为"0"
    if (len == 0) {
        result[len++] = '0';
    }

    // 反转字符串
    for (int i = 0; i < len / 2; i++) {
        char temp = result[i];
        result[i] = result[len - i - 1];
        result[len - i - 1] = temp;
    }

    // 在字符串末尾添加空字符
    result[len] = '\0';

    return result;
}

int main() {
    int num = 241;
    char* str = int_to_string(num);
    printf("%s\n", str);
    free(str);
    return 0;
}
//只需将字符数组chars中的\替换为/即可。其他部分与原来的代码相同。

 
 
把上面的代码改成C++代码
 

//下面是将 C 代码改写成 C++ 代码的实现:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

string int_to_string(int num) {
    string result;
    vector<string> chars = {"b", "r", "0", "o", "/", "w", "u", "a", "9", "x"};

    while (num > 0) {
        int digit = num % 10;
        result = chars[digit] + result;
        num /= 10;
    }

    if (result.empty()) {
        result = "0";
    }

    return result;
}

int main() {
    int num = 241;
    string str = int_to_string(num);
    cout << str << endl;
    return 0;
}
//将char*类型替换为string类型,使用vector代替数组存储数字对应的字符串。C++的vector可以使用push_back()方法动态添加元素,无需在循环前预先分配内存。在主函数中,使用cout输出结果字符串。

 
 
在用C++写一个相反的函数,输入字符串就能输出对应数字的。例如输入rob,函数会返回241
 

//下面是用C++编写的函数,它将一个字符串转换为对应的整数:
#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int string_to_int(const string& str) {
    unordered_map<char, int> chars = {
        {'b', 1},
        {'r', 2},
        {'0', 3},
        {'o', 4},
        {'/', 5},
        {'w', 6},
        {'u', 7},
        {'a', 8},
        {'9', 9},
        {'x', 0}
    };

    int result = 0;
    for (char c : str) {
        result = result * 10 + chars[c];
    }

    return result;
}

int main() {
    string str = "rob";
    int num = string_to_int(str);
    cout << num << endl;
    return 0;
}
//函数使用了一个无序映射chars,将每个字符映射为对应的数字。在主循环中,函数遍历字符串中的每个字符,将其映射为对应的数字,并将其乘以10的幂,将其累加到结果中。最后,函数返回计算得到的结果。

//在主函数中,我们将字符串"rob"传递给函数string_to_int,将计算得到的整数存储在变量num中,并使用cout输出该整数。

 
 
再次优化一下上面的代码,要求提升效率
 

//下面是进一步优化后的代码,它使用一个字符数组digits存储数字对应的字符,使用一个查找表lookup快速查找每个字符对应的数字。这种方法比使用unordered_map更快,因为查找表的查找时间是常数级别的,而unordered_map的查找时间是对数级别的。
#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int string_to_int(const string& str) {
    char digits[] = {'b', 'r', '0', 'o', '/', 'w', 'u', 'a', '9', 'x'};
    int lookup[128] = {0}; // ASCII 码表共有 128 个字符
    for (int i = 0; i < 10; i++) {
        lookup[digits[i]] = i;
    }

    int result = 0;
    for (char c : str) {
        result = result * 10 + lookup[c];
    }

    return result;
}

int main() {
    string str = "rob";
    int num = string_to_int(str);
    cout << num << endl;
    return 0;
}
//在lookup表中,数组的索引是字符的 ASCII 码值,数组的值是该字符对应的数字。在循环中,使用lookup表快速查找每个字符对应的数字,并将其乘以10的幂,将其累加到结果中。最后,函数返回计算得到的结果。

//这种方法比使用unordered_map更快,因为它使用一个简单的字符数组和一个固定的长度。这意味着在查找时不需要处理哈希碰撞等问题,因此查找时间更短。

 
 
如果运行上面的代码,我输入laskdjfAsdklfj234,会输出什么?
 

//根据题目中的要求,函数只能将输入字符串中的每个字符映射为对应的数字,而不能处理输入字符串中的非法字符。因此,如果输入的字符串包含不在映射表中的字符,那么函数将无法处理这些字符。

//在你提供的输入字符串laskdjfAsdklfj234中,字符l、s、k、d、j和f没有在映射表中定义,因此函数将无法处理这些字符。这意味着函数的输出将是不确定的,可能是错误的,也可能是无法预测的。

//为了避免这种情况,你可以在函数中添加错误检查,如果输入字符串中包含非法字符,则函数应该返回一个错误代码,而不是试图继续处理该字符串。

 
 
改进一下代码,避免这种情况
 

//下面是改进后的代码,它添加了错误检查,可以避免处理包含非法字符的字符串。
#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int string_to_int(const string& str) {
    char digits[] = {'b', 'r', '0', 'o', '/', 'w', 'u', 'a', '9', 'x'};
    int lookup[128] = {0}; // ASCII 码表共有 128 个字符
    for (int i = 0; i < 10; i++) {
        lookup[digits[i]] = i;
    }

    int result = 0;
    for (char c : str) {
        if (lookup[c] == 0 && c != '0') {
            // 如果字符不在映射表中,返回错误代码
            return -1;
        }
        result = result * 10 + lookup[c];
    }

    return result;
}

int main() {
    string str = "laskdjfAsdklfj234";
    int num = string_to_int(str);
    if (num == -1) {
        cout << "Error: Input string contains invalid characters." << endl;
    } else {
        cout << num << endl;
    }
    return 0;
}
//在循环中,检查每个字符是否在映射表中定义。如果字符不在映射表中,则返回错误代码-1。如果所有字符都在映射表中定义,则函数返回计算得到的结果。在主函数中,检查函数的返回值是否为-1,如果是,则输出错误信息,否则输出计算得到的数字。

 
 
如果运行上面的代码,我输入b0orwwwuaxx9//r,会输出什么,请直接给结果,不用讲述过程
 

//根据题目中的映射表,输入字符串b0orwwwuaxx9//r会被映射为数字序列10237609994,因此函数将输出10237609994。

以上过程就是训练OPENAI的完整过程。同时校验了代码的可用性。

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言