75,2测试点wa,求助大佬

P1015 [NOIP1999 普及组] 回文数

Faded_wind123 @ 2024-04-14 00:24:10


#include <iostream>
#include <string>

using namespace std;

int hw(string a) {
    int l = a.size();
    for (int i = 0; i < l / 2; i++) {
        if (a[i] != a[l - 1 - i]) {
            return 0;
        }
    }
    return 1;
}

string add(string a, string b, int jz) {
    int l1 = a.size(), l2 = b.size();
    if (l1 > l2) {
        b = string(l1 - l2, '0') + b;
    }
    if (l1 < l2) {
        a = string(l2 - l1, '0') + a;
    }
    int cf = 0, temp = 0;
    string c;
    int f = max(l1, l2);
    for (int i = 0; i < f; i++) {
        temp = a[f - 1 - i] + b[f - 1 - i] + cf - 2 * '0';
        cf = temp / jz;
        temp %= jz;
        c = char(temp + '0') + c;
    }
    if (cf != 0) {
        c = char(cf + '0') + c;
    }
    return c;
}

string change(string a) {
    string b;
    for (int i = a.size() - 1; i >= 0; i--) {
        b += a[i];
    }
    return b;
}

int main() {
    int k;
    string a;
    cin >> k >> a;
    int step = 0;

    do {
        if (hw(a)) {
            cout << step;
            return 0;
        }

        a = add(a, change(a), k);
        step++;
    } while (step <= 30);

    cout << "Impossible!";
    return 0;
}

by Faded_wind123 @ 2024-04-14 00:25:14

因为题目原因有点小长,在此先谢过各位大佬


by Faded_wind123 @ 2024-04-14 00:28:54

找到问题了,16进制没看到


by Faded_wind123 @ 2024-04-14 01:16:00

加了分更低了qaq


#include <iostream>
#include <string>

using namespace std;

int hw(string a) {
    int l = a.size();
    for (int i = 0; i < l / 2; i++) {
        if (a[i] != a[l - 1 - i]) {
            return 0;
        }
    }
    return 1;
}

string add(string a, string b, int jz) {
    int l1 = a.size(), l2 = b.size();
    if (l1 > l2) {
        b = string(l1 - l2, '0') + b;
    }
    if (l1 < l2) {
        a = string(l2 - l1, '0') + a;
    }
    int cf = 0, temp = 0;
    string c;
    int f = max(l1, l2);
    for (int i = 0; i < f; i++) {
        if (a[i] >= '0' && a[i] <= '9') {
            a[f - 1 - i] = a[f - 1 - i] - '0';
        } else {
            a[f - 1 - i] = a[f - 1 - i] - 'A' + 10; // 将字符 'A' 到 'F' 转换为对应的数字值
        }

        if (b[i] >= '0' && b[i] <= '9') {
            b[f - 1 - i] = b[f - 1 - i] - '0';
        } else {
            b[f - 1 - i] = b[f - 1 - i] - 'A' + 10; // 将字符 'A' 到 'F' 转换为对应的数字值
        }

        temp = a[f - 1 - i] + b[f - 1 - i] + cf;
        cf = temp / jz;
        temp %= jz;
        if (temp >= 0 && temp <= 9) {
            c = char(temp + '0') + c;
        } else {
            c = char(temp - 10 + 'A') + c; // 将数字值转换回字符 'A' 到 'F'
        }
    }
     if (cf >= 0 && cf <= 9) {
            c = char(cf+ '0') + c;
        } else {
            c = char(cf - 10 + 'A') + c; // 将数字值转换回字符 'A' 到 'F'
        }
    return c;
}
string change(string a) {
    string b;
    for (int i = a.size() - 1; i >= 0; i--) {
        b += a[i];
    }
    return b;
}

int main() {
    int k;
    string a;
    cin >> k >> a;
    int step = 0;

    do {
        if (hw(a)) {
            cout << step;
            return 0;
        }

        a = add(a, change(a), k);
        step++;
    } while (step <= 30);

    cout << "Impossible!";
    return 0;
}

by Martin_L @ 2024-08-09 16:21:14

虽然暂时对于这怎么错的还没什么头绪, 但是这边建议,不要在加和的过程中将字符转成数字又转回去,为什么不在刚开始输入的时候就直接转成int数组存起来呢,毕竟中途转来转去容易出错,况且编得也很辛苦。


by Martin_L @ 2024-08-09 16:42:00

一个关键问题在于,你在add函数中对c的处理:

if (temp >= 0 && temp <= 9) {
  c = char(temp + '0') + c;
} else {
  c = char(temp - 10 + 'A') + c; // 将数字值转换回字符
}

不是哥们我倒是问呢,这c是个string,你能这么加是吧

那么问题在于,你对一个string使用加号“+”的时候,它会认为你是把一个字符加到这个string上面(况且这么干也超废时间复杂度的)

其实你这个程序还有一些可吐槽的小细节……不过呢,关键就是那个问题:

为什么不转成int型数组,再操作捏?

希望你可以好好思考一下上述的问题。


|