Как преобразовать программу C++, генерирующую палиндромы, в ассемблер для SPOJ?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как преобразовать программу C++, генерирующую палиндромы, в ассемблер для SPOJ?

Сообщение Anonymous »

Я пытаюсь преобразовать следующую программу C++ в язык ассемблера (x86, синтаксис NASM), чтобы решить проблему SPOJ. Программа принимает несколько тестовых примеров, каждый из которых состоит из строки, представляющей число, и генерирует наименьший палиндром, больший или равный входным данным. Я пытаюсь переписать это на ассемблере (x86, NASM, 32-разрядная версия), чтобы удовлетворить ограничениям системы SPOJ.
Мой код C++ передается в spoj. Вот моя реализация на C++:
#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 - '0') + carry;
incremented = '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

Подробнее здесь: https://stackoverflow.com/questions/793 ... y-for-spoj
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как заставить ассемблер переводить инструкции в двоичный формат
    Anonymous » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • VS 2022 Добавить ссылку на службу, не генерирующую ClientCredentials для .Net Framework
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • VS 2022 Добавить ссылку на службу, не генерирующую ClientCredentials для .Net Framework
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Spoj: Простая арифметика (арита), давая неправильный ответ
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Любая идея для решения O (n log n) http://www.spoj.pl/problems/gannhat/?
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»