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上面(况且这么干也超废时间复杂度的)
其实你这个程序还有一些可吐槽的小细节……不过呢,关键就是那个问题:
希望你可以好好思考一下上述的问题。