Преобразовать строку в длинное число

209
26 апреля 2017, 12:40

Есть вектор длины n и строка длины m, содержащая только цифры. Необходимо в вектор записывать числа с максимум k цифрами, содержащиеся в строке, с конца. Например:

std::vector<unsigned int> v(3); // n = 3
std::string s = "52152000535"; // m = 11 (без `\n`)
size_t k = 4;
// в итоге в векторе должно быть следующее
v[0] == 535; // т.е. начальные нули отбрасываются
v[1] == 5200;
v[2] == 521; // т.е. если цифр не хватает, то берём всё, что осталось

Все параметры правильно согласованны, т.е. конфликтов нет, строка содержит исключительно цифры, нули не могут идти первыми.

У меня есть решение вида "для каждого элемента вектора берём нужную подстроку с конца с помощью substr() и преобразуем её в число с помощью stoll()", но решение использует несколько счётчиков и вероятность багов очень высока. Было бы прекрасно иметь решение с помощью итераторов и STL алгоритмов.

Answer 1

Прямолинейный подход к решению может выглядеть следующим образом.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
    size_t n = 3;
    size_t k = 4;
    std::vector<unsigned int> v(n);
    std::string s( "52152000535");
    size_t m = s.size();
    for (size_t i = 0; i < n && m != 0; i++ )
    {
        size_t length = std::min(k, m);
        m -= length;
        v[i] = static_cast<unsigned int>(std::stoul(s.substr(m, length)));
    }
    for (auto x : v) std::cout << x << ' ';
    std::cout << std::endl;
}

Вывод программы на консоль

535 5200 521

Нет никакой необходимости здесь искусственно прилеплять алгоритмы, тем более, если такое решение с алгоритмами, если оно существует, не очевидно.

Answer 2

Без STL, с одним счётчиком

std::vector<unsigned int> v; 
std::string s = "52152000535"; 
size_t k = 4;
size_t str_size = s.size();
int i;
for (i = str_size - k; i > 0; i -= k)
    v.push_back(std::stoi(s.substr(i, k)));
v.push_back(std::stoi(s.substr(0, i+k)));

Не очень понятно, почему вы используете std::stoll хотя вектор содержит unsigned int

READ ALSO
Бинарный поиск в &ldquo;массиве отрезков&rdquo;

Бинарный поиск в “массиве отрезков”

Задан упроядоченый vector из double, где каждый элемент представляет собой конец отрезкаНапример, {1,3,5,6,9} -- означает, что существуют следующие отрезки:...

235
Обращение к левому объекту в перегрузке

Обращение к левому объекту в перегрузке

Недавно начал изучать перегрузку операторовПытаюсь перегрузить оператор * как пересечение множеств, но не могу понять как в данном случае...

200
Как можно распаковать\получить инфу о файлах архива в C++?

Как можно распаковать\получить инфу о файлах архива в C++?

Архивы форматов rar,zip, необходимо: распаковывать архив, получать определенный фаил из архива, получать древо каталогов и список всех файлов...

235
Многопоточность, потоки

Многопоточность, потоки

Я новичок в этой темеХотел попробовать сделать одновременную работу нескольких функций

218