Mein C++-Code wurde in spoj übergeben. Hier ist meine C++-Implementierung:
Code: Select all
#include
#include
#include
#include
std::string reverseString(const std::string& str) {
return std::string(str.rbegin(), str.rend());
}
bool onlyZeroes(const std::string& str) {
return std::find_if(str.begin(), str.end(), [](char elem) { return elem != '0'; }) == str.end();
}
bool onlyNines(const std::string& str) {
return std::find_if(str.begin(), str.end(), [](char elem) { return elem != '9'; }) == str.end();
}
std::string incrementString(const std::string& str) {
std::string incremented = str;
int carry = 1;
for (int i = str.size() - 1; i >= 0 && carry; --i) {
int digit = (str[i] - '0') + carry;
incremented[i] = '0' + (digit % 10);
carry = digit / 10;
}
if (carry) {
incremented = '1' + incremented;
}
return incremented;
}
std::string generatePalindrome(const std::string& num) {
if (onlyZeroes(num)) {
std::string pal(num.size(), '0');
pal[0] = '1';
pal[num.size() - 1] = '1';
return pal;
}
if (onlyNines(num)) {
std::string pal(num.size(), '0');
pal[0] = '1';
pal += '1';
return pal;
}
std::string str = num;
int n = str.size();
while (true) {
std::string str1 = str.substr(0, n / 2);
std::string str2 = (n % 2 == 0) ? "" : str.substr(n / 2, 1);
std::string str3 = str.substr(n / 2 + (n % 2));
if (reverseString(str1) > str3) {
return str1 + str2 + reverseString(str1);
}
str3.assign(str.size(), '0');
if (n % 2 == 0) {
str1 = incrementString(str1);
} else {
str2 = incrementString(str2);
if (str2 == "10") {
str2 = "0";
str1 = incrementString(str1);
}
}
str = str1 + str2 + str3;
}
}
int main() {
int numberofTests;
std::cin >> numberofTests;
std::vector tests;
while (numberofTests-- >= 1) {
std::string num;
std::cin >> num;
tests.push_back(num);
}
for (const std::string& input : tests) {
std::cout