by Guest » 20 Jan 2025, 19:13
Ich versuche, das folgende C++-Programm in Assemblersprache (x86, NASM-Syntax) zu konvertieren, um ein SPOJ-Problem zu lösen. Das Programm nimmt mehrere Testfälle, die jeweils aus einer Zeichenfolge bestehen, die eine Zahl darstellt, und generiert das kleinste Palindrom, das größer oder gleich der Eingabe ist. Ich habe Mühe, dies in Assembly (x86, NASM, 32-Bit) neu zu schreiben, um die Einschränkungen des SPOJ-Systems zu erfüllen.
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
Ich versuche, das folgende C++-Programm in Assemblersprache (x86, NASM-Syntax) zu konvertieren, um ein SPOJ-Problem zu lösen. Das Programm nimmt mehrere Testfälle, die jeweils aus einer Zeichenfolge bestehen, die eine Zahl darstellt, und generiert das kleinste Palindrom, das größer oder gleich der Eingabe ist. Ich habe Mühe, dies in Assembly (x86, NASM, 32-Bit) neu zu schreiben, um die Einschränkungen des SPOJ-Systems zu erfüllen.
Mein C++-Code wurde in spoj übergeben. Hier ist meine C++-Implementierung:
[code]#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