Я пытаюсь преобразовать следующую программу 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
Как преобразовать программу C++, генерирующую палиндромы, в ассемблер для SPOJ? ⇐ C++
Программы на C++. Форум разработчиков
1737396816
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[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
Подробнее здесь: [url]https://stackoverflow.com/questions/79372290/how-to-convert-a-palindrome-generating-c-program-to-assembly-for-spoj[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия