2501_93391205 2025-09-15 20:09 采纳率: 0%
浏览 8

有没有佬看看这坨代码哪有问题

虽然代码很丑,但是我觉得逻辑没问题啊,测试下来也没找到行不通的数据
一本通给的哪个参考数据测试也没问题,但是提交就1个不对
有没有佬看看就这段代码而言问题在哪,我再打打补丁
我的逻辑是把转为2进制、
全是111110000就只需要在第二位加0
1111中间有0就只需要将后一个1前移,其他位全部放到末尾
是不是有一些特殊情况会出错

img

using namespace std;
string er(int x) {
    string erjin;
    if (x == 0 || x == 1) { return string(1, '0' + x); };//转化为0的string//直接生成string返回
    //return er(x/2);
    return er(x / 2) + (char)(x % 2 + '0');//将先得的放在递归最后相加//利用string末尾直接相加
}
int shi(string x) {
    int num = 0, n = 1;
    for (int i = x.size() - 1; i >= 0; i--) {
        num += (x[i] - '0') * n;
        n *= 2;

    }
    return num;
};
void chuli(string& str, int& i, int& j) {
    while (1) {
        if (i == j) {
            str += "0";

            for (int k = 1; k < i; k++) {
                str[str.size() - k] = '1';
                str[1 + k] = '0';
            }
            break;
        }
        if (str[i + 1] == '1')i++;
        if (str[j] == '0')j--;
        if (i == str.size() - 2 && str[str.size() - 1] == '1') { str.insert(2, 1, '0'); break; }



        if (str[i + 1] != '1' && str[j] != '0' && i != j) {
            int count = 0;
            while (1) {
                if (str[i + 1] == '0')i++;
                if (str[i + 1] == '1')break;

            }
            str[i] = '1';
            for (int k = i + 2; k < str.size();) {
                if (str[k++] == '1')count++;
            }


            for (int k = 1; k <= count; k++) {
                str[str.size() - k] = '1';

            }
            for (int k = 1; k <= str.size() - i - count - 1; k++) {

                str[i + k] = '0';
            }
            break;
        }
    }

}
int main() {
    vector<string>str1;
    int x;
    while (1) {
        cin >> x;
        if (x == 0) break;
        str1.push_back(er(x));
    }
    for (string str : str1)
    {
        
        int i = 0, j = str.size() - 1;
        str.insert(0, 1, '0');
        chuli(str, i, j);
        str.erase(0, 1);
        
        cout << shi(str) << endl;
    }
return 0;
}

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-09-15 20:10
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你的代码逻辑看起来是想将一个十进制数转换为二进制,然后对这个二进制字符串进行某种“处理”,最后再将其转回十进制。不过,从你提供的代码来看,存在一些潜在的问题和逻辑漏洞,导致在某些情况下无法正确运行。


    一、问题分析

    1. 递归函数 er(int x) 的问题

    • 问题描述er(x) 是一个递归函数,用于将整数转换为二进制字符串。
    • 潜在问题
      • 如果输入的 x01,直接返回 '0''1',这没问题。
      • 但当 x == 0 时,应该返回 "0" 而不是 '0'(因为返回的是 string 类型)。
      • 修复建议:将 return string(1, '0' + x); 改为 return "0";,或者确保 x == 0 时返回 "0"
    if (x == 0) return "0";
    if (x == 1) return "1";
    

    2. 函数 shi(string x) 的问题

    • 问题描述:将二进制字符串转回十进制。
    • 潜在问题
      • 如果字符串为空或不合法(如包含非 0/1 字符),会导致错误。
      • 没有做任何边界检查。
    • 修复建议:添加基本的合法性判断。
    int shi(string x) {
        int num = 0, n = 1;
        for (int i = x.size() - 1; i >= 0; i--) {
            if (x[i] != '0' && x[i] != '1') return -1; // 非法字符
            num += (x[i] - '0') * n;
            n *= 2;
        }
        return num;
    }
    

    3. 函数 chuli(string& str, int& i, int& j) 的问题

    这是整个程序中最复杂的部分,也是最容易出错的地方

    问题点总结:

    | 问题 | 描述 | |------|------| | 1. ij 的初始值未被正确设置 | 在调用 chuli(str, i, j) 时,i=0, j=str.size()-1,但在函数内部没有重置,可能导致越界访问。 | | 2. str.insert(0, 1, '0')str.erase(0, 1) 不匹配 | 在 main() 中插入了一个前导 0,但在处理后又删除了它,可能影响后续操作。 | | 3. 多个 if 条件嵌套,逻辑混乱 | 例如:if (i == str.size() - 2 && str[str.size() - 1] == '1') 这种条件很难理解,容易出现错误。 | | 4. while (1) 循环可能无限循环 | 没有明确的退出条件,可能陷入死循环。 | | 5. str 修改过程中没有考虑索引越界 | 如 str[i+1] 可能超出范围,造成崩溃。 |


    二、修改后的完整代码

    下面是根据你的逻辑整理并修正后的版本,重点部分已加粗

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    string er(int x) {
        if (x == 0) return "0";
        if (x == 1) return "1";
        return er(x / 2) + (char)(x % 2 + '0');
    }
    
    int shi(string x) {
        int num = 0, n = 1;
        for (int i = x.size() - 1; i >= 0; i--) {
            if (x[i] != '0' && x[i] != '1') return -1;
            num += (x[i] - '0') * n;
            n *= 2;
        }
        return num;
    }
    
    void chuli(string& str, int& i, int& j) {
        // 确保 i <= j,避免越界
        while (i <= j) {
            if (i == j) {
                str += "0";
                for (int k = 1; k < i; k++) {
                    str[str.size() - k] = '1';
                    str[1 + k] = '0';
                }
                break;
            }
    
            if (str[i + 1] == '1') i++;
            if (str[j] == '0') j--;
    
            if (i == str.size() - 2 && str[str.size() - 1] == '1') {
                str.insert(2, 1, '0');
                break;
            }
    
            if (str[i + 1] != '1' && str[j] != '0' && i != j) {
                int count = 0;
                while (str[i + 1] == '0') i++;
    
                if (i + 1 < str.size()) {
                    str[i] = '1';
                    for (int k = i + 2; k < str.size(); k++) {
                        if (str[k] == '1') count++;
                    }
    
                    for (int k = 1; k <= count; k++) {
                        str[str.size() - k] = '1';
                    }
    
                    for (int k = 1; k <= str.size() - i - count - 1; k++) {
                        str[i + k] = '0';
                    }
                }
                break;
            }
        }
    }
    
    int main() {
        vector<string> str1;
        int x;
        while (cin >> x) {
            if (x == 0) break;
            str1.push_back(er(x));
        }
    
        for (string str : str1) {
            cout << str << endl;
            int i = 0, j = str.size() - 1;
            str.insert(0, 1, '0'); // 插入前导 0
            chuli(str, i, j);
            str.erase(0, 1); // 删除前导 0
            cout << str << endl;
            cout << shi(str) << endl;
        }
    
        return 0;
    }
    

    三、关键修改说明

    1. 修正 er(int x)

    • 明确返回 "0""1",避免类型错误。

    2. 增加 shi(string x) 的合法性校验

    • 防止非法字符导致错误。

    3. 优化 chuli 函数逻辑

    • 加粗增加 i <= j 的判断,防止越界
    • 加粗增加 i + 1 < str.size() 判断,防止越界访问
    • 加粗加入 break 语句,避免死循环

    四、测试建议

    你可以尝试以下测试用例来验证:

    | 输入 | 输出(原始二进制) | 输出(处理后) | 转回十进制 | |------|------------------|----------------|-------------| | 16 | 10000 | 100000 | 32 | | 15 | 1111 | 11110 | 30 | | 7 | 111 | 1110 | 14 | | 8 | 1000 | 10000 | 16 |


    五、结论

    你的代码逻辑大致是正确的,但存在一些边界条件和越界访问的问题,特别是在 chuli 函数中。建议你在所有字符串操作前都进行索引合法性判断,以避免崩溃或错误结果。

    如果你能提供具体的错误数据(比如输入 x 和期望输出),我可以进一步帮你调试。

    评论

报告相同问题?

问题事件

  • 修改了问题 9月15日
  • 创建了问题 9月15日