Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Решение ребуса Volvo + Fiat = Motor 
V
    Опции темы
ioManip
  Дата 7.5.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Подскажите, что не верно? В ответе выдает только 99999 + 9999 = 99999
Код

int main()
{
    int v, o, l, f, i, a, t, m, r;

    
    for (v = 1; v < 9; v++)
        for (o = 0; o < 9; o++)
            for (l = 0; l < 9; l++)
                for (f = 0; f < 9; f++)
                    for (i = 0; i < 9; i++)
                        for (a = 0; a < 9; a++)
                            for (t = 0; t < 9; t++)
                                for (m = o; m < 9; m++)
                                    for (r = 0; r < 9; r++)
    if ( 
         (v != 0) && (v != l) && (v != f) && (v != i) && (v != a) && (v != t) && (v != m) && (v != r) &&
         (o != v) && (o != l) && (o != f) && (o != i) && (o != a) && (o != t) && (o != m) && (o != r) &&
         (l != v) && (l != o) && (l != f) && (l != i) && (l != a) && (l != t) && (l != m) && (l != r) &&
         (f != v) && (f != o) && (f != l) && (f != i) && (f != a) && (f != t) && (f != m) && (f != r) &&
         (i != v) && (i != o) && (i != l) && (i != f) && (i != a) && (i != t) && (i != m) && (i != r) &&
         (a != v) && (a != o) && (a != l) && (a != f) && (a != i) && (a != t) && (a != m) && (a != r) &&
         (t != v) && (t != o) && (t != l) && (t != f) && (t != i) && (t != a) && (t != m) && (t != r) &&
         (m != v) && (m != o) && (m != l) && (m != f) && (m != i) && (m != a) && (m != t) && (m != r) &&
         (r != v) && (r != o) && (r != l) && (r != f) && (r != i) && (r != a) && (r != t) && (r != m) &&
            
         ( (v * 10000) + (o * 1000) + (l * 100) + (v * 10) + o + (f * 1000) + (i * 100) + (a * 10) + t ) ==
         ( (m + 10000) + (o + 1000) + (t * 100) + (o * 10) + r ) 
        
        );
    
         cout << v << o << l << v << o << " + " << f << i << a << t << " = " << m << o << t << o << r;
                
             

    return 0;
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
bsa
Дата 7.5.2013, 11:33 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



мне кажется, здесь алгоритм проще: http://otvet.mail.ru/question/65170996
PM   Вверх
math64
Дата 7.5.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



m = o; вместо m= 0;
Но может ещё где ошибки
PM   Вверх
ioManip
Дата 7.5.2013, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



А ответ нужно в цикле же выводить?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 7.5.2013, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  7.5.2013,  13:05 Найти цитируемый пост)
А ответ нужно в цикле же выводить? 

Конечно!
Цитата(ioManip @  7.5.2013,  12:26 Найти цитируемый пост)
    if ( 
         (v != 0) && (v != l) && (v != f) && (v != i) && (v != a) && (v != t) && (v != m) && (v != r) &&
         (o != v) && (o != l) && (o != f) && (o != i) && (o != a) && (o != t) && (o != m) && (o != r) &&
         (l != v) && (l != o) && (l != f) && (l != i) && (l != a) && (l != t) && (l != m) && (l != r) &&
         (f != v) && (f != o) && (f != l) && (f != i) && (f != a) && (f != t) && (f != m) && (f != r) &&
         (i != v) && (i != o) && (i != l) && (i != f) && (i != a) && (i != t) && (i != m) && (i != r) &&
         (a != v) && (a != o) && (a != l) && (a != f) && (a != i) && (a != t) && (a != m) && (a != r) &&
         (t != v) && (t != o) && (t != l) && (t != f) && (t != i) && (t != a) && (t != m) && (t != r) &&
         (m != v) && (m != o) && (m != l) && (m != f) && (m != i) && (m != a) && (m != t) && (m != r) &&
         (r != v) && (r != o) && (r != l) && (r != f) && (r != i) && (r != a) && (r != t) && (r != m) &&
            
         ( (v * 10000) + (o * 1000) + (l * 100) + (v * 10) + o + (f * 1000) + (i * 100) + (a * 10) + t ) ==
         ( (m + 10000) + (o + 1000) + (t * 100) + (o * 10) + r ) 
        
        );
    
         cout << v << o << l << v << o << " + " << f << i << a << t << " = " << m << o << t << o << r;




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 7.5.2013, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(math64 @  7.5.2013,  12:53 Найти цитируемый пост)
m = o; вместо m= 0;

Аналогично:
Цитата(ioManip @  7.5.2013,  12:26 Найти цитируемый пост)
         (v != 0)

вместо v != o.

Далее: <= 9 вместо < 9 во всех циклах.
Далее: m как и v отсчитывается от 1 (не от 0)
Далее: 
Цитата(feodorv @  7.5.2013,  14:03 Найти цитируемый пост)
(m + 10000) + (o + 1000) + (t * 100) + (o * 10) + r

Здесь кое где нужно умножение, не сложение...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 7.5.2013, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Часть проверок условий if можновынести во внешние циклы - так намного ускорится выполнение программы.
PM   Вверх
ioManip
Дата 9.5.2013, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Всем спасибо!  smile  Получилось, что то вроде этого ( немного страшновато выглядит smile )
Код

#include <iostream>

using namespace std;

int main()
{
    int v, o, l, f, i, a, t, m, r;
    int count = 0;
    
    for (v = 1; v <= 9; v++)              
        for (o = 0; o <= 9; o++)          
            if (o != v)  
               for (l = 0; l <= 9; l++)  
                   if ( 
                       (l != o) && 
                       (l != v) 
                      )
                      for (f = 0; f <= 9; f++)
                          if ( 
                              (f != v) && 
                              (f != o) && 
                              (f != l) 
                             )
                             for (i = 0; i <= 9; i++)
                                 if ( 
                                     (i != f) && (i != l) && 
                                     (i != 0) && (f != v) 
                                    )
                                    for (a = 0; a <= 9; a++)
                                        if ( 
                                             (a != i) && (a != f) && 
                                             (a != l) && (a != o) && 
                                             (a != v) 
                                           )
                                           for (t = 0; t <= 9; t++)
                                               if ( 
                                                   (t != a) && (t != i) && 
                                                   (t != f) && (t != l) && 
                                                   (t != o) && (t != v) 
                                                  )
                                                  for (m = 1; m <= 9; m++)
                                                      if ( 
                                                          (m != t) && (m != a) && 
                                                          (m != i) && (m != f) && 
                                                          (m != l) && (m != o) && 
                                                          (m != v) 
                                                         )
                                                         for (r = 0; r <= 9; r++)
                                                             if ( 
                                                                 (r != m) && (r != t) && 
                                                                 (r != a) && (r != i) && 
                                                                 (r != f) && (r != l) && 
                                                                 (r != o) && (r != v) 
                                                                )
            
    if ( v * 10000 + o * 1000 + l * 100 + v * 10 + o + f * 1000 + i * 100 + a * 10 + t == 
         m * 10000 + o * 1000 + t * 100 + o * 10 + r )
    {  
        cout << v << o << l << v << o << " + " << f << i << a << t << " = " 
             << m << o << t << o << r << endl;
        count++;
    }
    
    cout << endl;
    cout << "Всего решений: " << count << endl;   
    
    return 0;        
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 9.5.2013, 15:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(ioManip @  9.5.2013,  04:03 Найти цитируемый пост)
немного страшновато выглядит

угу, есть чуток.

Вариант маленько попроще:
Код

int main()
{
    int A [10] = {0,1,2,3,4,5,6,7,8,9};
    int & v = A[0], & o = A[1], & l = A[2], & f = A[3], & i = A[4], & a = A[5], & t = A[6], & m = A[7], & r = A[8];

    int count = 0;
    while (next_permutation (A, A+10))
       if ( v * 10000 + o * 1000 + l * 100 + v * 10 + o + f * 1000 + i * 100 + a * 10 + t == 
            m * 10000 + o * 1000 + t * 100 + o * 10 + r )
       {  
           cout << v << o << l << v << o << " + " << f << i << a << t << " = " 
                << m << o << t << o << r << endl;
           count++;
       }
    
    cout << endl;
    cout << "Всего решений: " << count << endl;   
    
    return 0;        
}


Код

Всего решений: 10
ваш код, кстати, выдает решений 23, но среди них есть неверные, например:
Код

17617 + 9753 = 27370

так что упрощение кода, как видите, выявляет ошибки.
(правда не гарантирую что упрощенный код безошибочен.)

PM MAIL   Вверх
mes
Дата 9.5.2013, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  9.5.2013,  14:02 Найти цитируемый пост)
Вариант маленько попроще:

еще вариантик.. немного многословнен правда в сравнении с вариантом от  volatile smile
Код

#include <iostream>
#include <algorithm>

namespace rebus {
namespace data {

  enum nums { v, o, l, f, i, a, t, m, r, end };

  const char chars[] = { 'v', 'o', 'l', 'f', 'i', 'a', 't', 'm', 'r' };

  unsigned int digits[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  const int arg1[] = { v,o,l,v,o, end};
  const int arg2[] = { f,i,a,t,   end};
  const int sum[]  = { m,o,t,o,r, end};
}

std::string make_word(const int * value)
{
  std::string res;

  for(;*value !=data::end; ++value) res+= data::chars[*value];

  return res;
}

unsigned int make_number(const int * value)
{
  unsigned int res =0;

  for(;*value !=data::end; ++value) 
  {
    res *= 10;
    res += data::digits[*value];
  }

  return res;
}

bool iterate()
{
  return std::next_permutation(data::digits,data::digits+10);
}

bool has_variant()
{
  return make_number(data::arg1)
       + make_number(data::arg2)
      == make_number(data::sum);
}

void show_task()
{
  std::cout 
    << "task: " 
    << make_word(data::arg1) 
    << " + "
    << make_word(data::arg2) 
    << " = "
    << make_word(data::sum)
    << std::endl;
}

void show_variant(int i)
{
  std::cout 
    << "variant " << i << ": "
    << make_number(data::arg1)
    << " + "
    << make_number(data::arg2)
    << " = "
    << make_number(data::sum)
    << std::endl;
}

void show_finish()
{
  std::cout << "finish" << std::endl;
}

void eval()
{
  show_task();

   int variant=0;

  do 
  {
    if (has_variant()) show_variant(++variant);

  } while (iterate());

  show_finish();
}
}

int main()
{
  rebus::eval();
}

http://codepad.org/h59aVh2V

Добавлено через 1 минуту и 27 секунд
Цитата

task: volvo + fiat = motor
variant 1: 15615 + 9743 = 25358
variant 2: 15715 + 9643 = 25358
variant 3: 36736 + 9825 = 46561
variant 4: 36836 + 9725 = 46561
variant 5: 46346 + 9821 = 56167
variant 6: 46846 + 9321 = 56167
variant 7: 71571 + 9642 = 81213
variant 8: 71671 + 9542 = 81213
variant 9: 72472 + 9651 = 82123
variant 10: 72672 + 9451 = 82123
finish



--------------------
PM MAIL WWW   Вверх
math64
Дата 9.5.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Интересно было бы видеть код next_permutation(). Кстати Ваш код может выдать решения с v=0 и f=0 если такие найдутся.
Если бы использовалось 8 букв, каждое решение выдавалось бы дважды,
{выделена ошибка копипаста}
next_permutation-это std::next_permutation , как понятно из кода mes (писал до него) 


Это сообщение отредактировал(а) math64 - 9.5.2013, 16:13
PM   Вверх
mes
Дата 9.5.2013, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(math64 @  9.5.2013,  15:05 Найти цитируемый пост)
 Кстати Ваш код может выдать решения с v=0 и f=0 если такие найдутся.

так а почему бы и нет ?!  буква имеет право быть и нулем smile

Цитата(math64 @  9.5.2013,  15:05 Найти цитируемый пост)
Если бы next_permutation 8 букв, каждое решение выдавалось бы дважды,

не понял..


Цитата(mes @  9.5.2013,  15:10 Найти цитируемый пост)
 буква имеет право быть и нулем 

если ж нет, просто выкинуть ее из строки мутации (ну и подправив размер) smile

Добавлено через 7 минут и 28 секунд
Цитата(math64 @  9.5.2013,  15:05 Найти цитируемый пост)
Если бы использовалось 8 букв, каждое решение выдавалось бы дважды,
{выделена ошибка копипаста}

все равно не понятны выводы.. 


Это сообщение отредактировал(а) mes - 9.5.2013, 16:15


--------------------
PM MAIL WWW   Вверх
volatile
Дата 9.5.2013, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  9.5.2013,  16:10 Найти цитируемый пост)
не понял

mes, это math64, критикует мой код.

math64, строго говоря - да.
еще, если уж так-же педантично расставлять все точки над ё, нужно делать так:
do {
...
} while (next_permutation(..));
иначе первый вариант мы не проверяем.  

тем не менее, все эти точки над ё, на результат действия не оказывают.  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.