Как сгенерировать номер из 3 цифр из списка номеров с помощью c ++? - PullRequest
3 голосов
/ 23 мая 2019

Я новый программист и хочу сгенерировать массив чисел из 3 цифр из списка номеров (2,5,8). Я создал код, но результат не является моим ожидаемым результатом. Это мой простой код:

int main()
{
    int arr[3]={2,5,8};

    int d=3;
    int times=1;

    for (int a:arr){
        int sum = a;
        for (int i=1; i<d; i++){
            times *= 10;
            sum += a*times;
        }
        cout<<sum<<endl;
        sum=0;
    }

    return 0;
}

Мой ожидаемый результат 222,555 и 888, но фактический результат составляет 222,55005 и 8800008.

Ответы [ 4 ]

4 голосов
/ 23 мая 2019

Это поможет наверное. Вы забыли сбросить times переменную

int main()
{
    int arr[3]={2,5,8};

    int d=3;
    int times=1;

    for (int a:arr){
        int sum = a;
        for (int i=1; i<d; i++){
            times *= 10;
            sum += a*times;
        }
        cout<<sum<<endl;
        times = 1;   //<---added
        sum=0;
    }
    return 0;
}
3 голосов
/ 23 мая 2019

Чтобы ваш текущий код сгенерировал 222, 555, 888, вы забыли переустановить times.

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

int mul_by_111(int n) // { return 111 * n; }
{
    int sum = a;
    int times = 1;
    for (int i = 1; i < 3; ++i) {
        times *= 10;
        sum += a * times;
    }
    return sum;
}

int main()
{
    int arr[] = {2, 5, 8};
    for (int a:arr){
        std::cout << mul_by_111(a) << std::endl;
    }
}

Если вы хотите, чтобы декартово произведение отображало 222, 225, 228, 522, .., 888

Вы можете (наивно) сделать это с 3 циклами:

int main()
{
    int arr[] = {2, 5, 8};
    for (int a:arr){
        for (int b:arr){
            for (int c:arr){
                std::cout << a << b << c << std::endl;
            }
        }
    }
}

Некоторые библиотеки, например range-v3 , предлагают cartesian_product, чтобы сделать его еще проще:

for (auto t : ranges::view::cartesian_product(arr, arr, arr)) {
    std::cout << std::get<0>(t) << std::get<1>(t) << std::get<2>(t) << std::endl;
    // std::apply([](auto... args){ (std::cout << ... << args) << std::endl; }, t); // C++17
}
0 голосов
/ 23 мая 2019

Проблема скорее в объеме переменных. Просто держите их в блоке, и все хорошо:

int main()
{
    int arr[3]={2,5,8};

    int d=3;

    for (int a:arr){
        int sum = a;
        int times=1;
        for (int i=1; i<d; i++){
             times *= 10;
             sum += a*times;
        }
        cout<<sum<<endl;
    }
    return 0;
}

Сумма и время переменных будут инициализированы при входе в блок. Нет необходимости сбрасывать их.

0 голосов
/ 23 мая 2019

Использование std::stringstream становится тривиальным:

#include <sstream>
#include <iostream>

int main()
{
  std::stringstream ss;
  ss << 2 << 5 << 8; 
  int result{};
  ss >> result;
  std::cout << result << std::endl;
}

Обновление:

Чтобы сделать перестановку частью алгоритма, вы можете использовать std::next_permutation:

std::string s("258");
do {
    std::cout << s << '\n';
} while(std::next_permutation(s.begin(), s.end()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...