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

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

Post by Guest »

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post