Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2013, 19:23   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вот так и нужно было сразу писать условие
Код:
#include <stdlib.h>
#include <stdio.h>

int
main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    if (a < 0 || b < 0) {
        printf("-1\n");
    } else if (!a || !b) {
        printf("0\n");
    } else if ((a + b) % 2) {
        printf("-1\n");
    } else {
        int a2, b2, i = 1;
        a2 = b2 = (a + b) / 2;
        if (a > b) {
            int c = a;
            a = b;
            b = c;
        }
        while (!(a2 == a && b2 == b) && !(a2 % 2 + b2 % 2)) {
            a2 /= 2;
            b2 += a2;
            ++i;
        }
        if (a2 == a && b2 == b) {
            printf("%d\n", i);
        } else {
            printf("-1\n");
        }
    }
    return 0;
}
Теперь "просто" разберитесь в решении.

upd
Чуть исправил код (добавил пару условий).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.03.2013 в 21:11.
BDA на форуме Ответить с цитированием
Старый 16.03.2013, 19:27   #12
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

думаю у задачи должно быть красивое алгоритмическое решение, а то что ты пытаешься делать будет циклиться (или придеца хранить все уже просмотренные варианты, но это нехорошо, я думаю).

Ну вот, BDA нашел красивое решение )

А можно и "в лоб" решать, но на плюсах будет не красиво, на прологе сносно )) :
Код:
p(0, _):-!.
p(_, 0):-!.
p(A, B):-
  retract(t(A, B)), !, fail;
  assert(t(A, B)),
  B >= A, !, BB is B - A, AA is A + A, p(AA, BB)
  ; AA is A - B, BB is B + B, p(AA, BB).

clear:-
  retract(t(_,_)), clear.
clear.

count(N, R):-
  retract(t(_,_)), !, NN is N + 1, count(NN, R);
  R is N.

g(A, B):-
  notrace, clear, !, (p(A, B), count(0, R), write(R);
  write(-1)), !.
rrrFer вне форума Ответить с цитированием
Старый 16.03.2013, 19:30   #13
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Спасибо, попробую))
akademochka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц