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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2013, 10:46   #1
FIREMAX
 
Регистрация: 28.11.2012
Сообщений: 6
Радость Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност

Задача: Последовательность 011212201220200112… строится так: сначала 0, затем повторяется следующее действие: уже написанную часть приписывают справа с заменой 0 на 1, 1 на 2, 2 на 0, т.е.
0->01->0112->01121220->011212202001-> 0112122020010112.
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательности нулей ( за исключением представления числа 0).Используя эту функцию, получить двоичное 1|16-ричное 2 представления данных пяти чисел.

Помогите разобратся с ошибкой.
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. function getprgvalue(const num:Integer):integer;
  3. var transpcount, pow2, m, a:Integer;
  4. function log2i(const cf:Integer):Integer;
  5. var n:Single;
  6. begin
  7. n:=log2i(cf);
  8. if frac(n)<>0 then
  9. result:=trunc(n)+1
  10. else
  11. result:=trunc(n);
  12. end;
  13. begin
  14. transpcount:=0;
  15. m:=num;
  16. while m>1 do
  17. begin
  18. pow2:=log2i(m);
  19. a:=round(power(2, pow2)/2); ( Ошибка "power" )
  20. m:=m-a;
  21. inc(transpcount);
  22. end;
  23. result:=transpcount mod 3;
  24. form1.Memo1.Lines.Add(floattostr(re sult));
  25. end;
FIREMAX вне форума Ответить с цитированием
Старый 02.02.2013, 12:50   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

1. Воспользуйтесь кнопкой # для оформления кода.
2. Как минимум:
Код:
function log2i(const cf:Integer):Integer;
var n:Single;
begin
n:=log2i(cf);
if frac(n)<>0 then
result:=trunc(n)+1
else
result:=trunc(n);
end;
В оформлении этой функции сделан рекурсивный вызов.
При этом нет условия для завершение функции. Т.е. в стек будут грузиться вызовы:
log2i(cf) -> log2i(cf) -> log2i(cf) ...
что приведет к его, стека, переполнению.
Следующий, за вызовом, код не получит управления.


Как минимум ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност FIREMAX Помощь студентам 3 28.11.2012 22:52
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност FIREMAX Паскаль, Turbo Pascal, PascalABC.NET 0 28.11.2012 20:54
целое число больше 5 000 000 000 в С++ Артём Волжанкин Помощь студентам 5 06.11.2012 18:38