Ветвление и ограничение памяти

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем добрый день. Пытаюсь написать небольшую программу, но столкнулся со сложностью. Есть переменная x, которая при запуске программы =0. По ходу выполнения програмы ее значение должно увеличиваться (ветвиться как ветки дерева) до достижения определенного результата (определенного пользователем), после чего переменная сбрасывается в 0. И так каждый раз при новом новом цикле. В зависимости от условий (TRUE - FALSE) значение переменной может идти по уже созданный ветвям или создавать новую ветвь. Попробую объяснить что нужно. Проще будет нарисовать:

В начале х = 0, в зависимости от условий TRUE - FALSE значение х меняется по формуле

TRUE: х = (х * 2) + 1

FALSE: х = (х + 1) * 2

В результате Х идет по одной из ветвей (если ветви нет, то оная будет создана). При этов вероятность пересечения ветвей крайне мала. Это для меня решающий фактор - не пересечение с другими "ветвями". Чем меньше вероятность такого события - тем лучше.

И так, суть проблемы: ограничение на размер Х. Даже ести взять Х как unsigned int то до предела 65535 можно дойти очень быстро, всего за несколько условий TRUE - FALSE. Мне же нужно иметь возможность прогнать хотя бы 30 условий TRUE - FALSE и при этом не иметь каких-либо ошибок (как на пример переполнение переменной).

Как выход вижу два варианта:

1) изменение формулы (но ума не приложу что можно использовать другое и при этом не "наехать" на другую ветвь..

2) не использовать Х как int. Возможно есть другие способы храниения значения? Например, разбивать на ресколько динамичных переменных, которые будут содаваться при необходимости...

Голова кипит. Бьюсь над этой задачей уже несколько недель, но так и не нашел выхода. Надеюсь на вашу помощь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

Даже ести взять Х как unsigned int

Ну. если кипит и не можете придумать другой маркировки, то возьмите unsigned long - предельное значение - 4 294 967 295

Если мало, то возьмите unsigned long long - предельное значение 18 446 744 073 709 551 615

forfrends
Offline
Зарегистрирован: 24.02.2015

Спасибо, не знал что можно так определять размерность! Надеюсь это поможет!

Logik
Offline
Зарегистрирован: 05.08.2014

Можно, то можно, но зачем вы двоичный код изобретаете заново понять нельзя. Что за задача такая?

forfrends
Offline
Зарегистрирован: 24.02.2015

Что вы имеете в виду говоря о двочном коде?

Задачу описал выше. Ну, если проще, это что-то вроде базы данных, которая должна заполнятся по мере получения новых данных. Где х - это конкретные данные, а TRUE и FALSE это конкретные значения этих данных (точнее соответствие или не соответствие характеристик и/или описания). Это можно сравнить с игрой "угадай слово", где загадывается слово, в противник задает наводящие вопросы: "Летает? Сделано человеком? Самолет?". где "Летает" и "Сделано человеком" - характеристики (TRUE), а "самолет" - конкретные данные (х).

В общем принцып совершенно тот же. Только цель другие, и другое использование/применение. Просто уперся в переполнение переменной и все....

А что вы имели в виду говоря о двоичной системе? Кстати, думал ее применить, но не нашел как.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

Что вы имеете в виду говоря о двочном коде?

Ваше дерево - это двоичный код. На каждом узел выбор 0 или 1 (по какому пути дальше идти). И представлять его можно гораздо экономичнее. чем Вы пытаетесь. Рлкгуглите "приедставление бинарных деревьев".