Wie konvertiert man ein Palindrom-generierendes C++-Programm in Assembly für SPOJ?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie konvertiert man ein Palindrom-generierendes C++-Programm in Assembly für SPOJ?

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

Top