Помощь - Поиск - Пользователи - Календарь
Полная версия: Почему моя прога виснет?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Skrip
У меня прога виснет если n> 2500 (примерно), при этом диспетчер задач не говорит, что она повисла. Почему?

Код
type sm_type=array [0..10000] of char;
var sm: sm_type;
st:string;
i,n,is,si: integer;

begin

n:=1;
While n<>0 do begin
  Write('>');
  readln(n);
case n of
0: exit end;

for i:=1 to n do begin
str(i, st);
 for is:=1 to length(st) do begin si:=si+1;
 sm[si]:=st[is] end;

end;
Writeln('Number ',n,'= ',sm[n]);
Writeln;
end;
end.
Altair
Процессор долго вычисляет.
Это не зависание, ждите.
Если у вас не Крэй, то это, при n>2500 будет долго вычислятся...
APAL
А еще si не инициализирована в самом начале...
А может в процессе ее значение переваливает за 32767 ?...
Но скорее всего выходит за рамки 0..10000 - надо проверку ставить, так сказать "защиту от дурака"
Altair
Сомневаюсь, я думаю, что просто время вычисления, т.к. вот на этом коде:

Код
for i:=1 to n do begin
str(i, st);
for is:=1 to length(st) do begin si:=si+1;
sm[si]:=st[is] end;

количество итераций растет лавиобразно ...

а что делает прога?
volvo
Skrip

Можно вопрос ? Задание звучит так ?

"Дано натуральное n. Вывести n-ую цифру последовательности 12345678910111213…, в которой выписаны подряд все натуральные числа."
Altair
volvo чародей smile.gif
Откуда узнал? может прога вообще написанна на 100 неправильно?
Но если угадал, то это точно без магии не обошлось smile.gif :D
volvo
Oleg_Z

А Debugger зачем? (Кстати, программа-таки дает неверные ответы... :yes:)

Хотя, может условие было другим.... rolleyes.gif
Ждем автора...

А если я все-таки прав насчет условия, то эта задача решается без массивов по 10000 элементов и безо всяких задержек, т.е. практически мгновенно:
Код

Function Power(a, x: LongInt): LongInt;
 Begin
   Power := Trunc( Exp(x * Ln(a)) )
 End;

Const
 n: Integer = {110}  (* result = 6 *)
              {18}   (* result = 1 *)
              19   (* result = 4 *)
              {1992} (* result = 0 *)
              {100}  (* result = 5 *)
              {201}  (* result = 3 *)
              {215}  (* result = 6 *)
              {621}  (* result = 3 *)
              {154}  (* result = 8 *)
            ;
Var
 TPower, nPrev: Integer;
 i, nCount, nPosIn: Integer;
 Decr: Integer;
 s: String;
Begin
 TPower := 0; nPrev := n;
 Repeat
   Inc(TPower);
   Decr := 9 * TPower * Power(10, Pred(TPower));
   n := n - Decr;
 Until n < 0;
 n := n + Decr;

 nCount := (n div TPower) + (n mod TPower);
 Dec(TPower);
 For i := 1 To TPower do
   Inc( nCount, 9 * Power(10, Pred(i)) );
 nPosIn := Succ(TPower) - (n mod Succ(TPower));

 Str(nCount, s);
 WriteLn('Digit #', nPrev, ' = ', s[nPosIn])
End.
Skrip
Задание было такое.
Вводим n. По данному числу n (1<=n<=10000) определить n-ю по счуту цифру в последовательности чисел от 1 до n.

Oleg_Z, наврятли это комп. долго думает, потому что 2487 высчитывает молнееносно, а 2500 вообще прога выключается. Это я что-то в коде обшибся, получается... sad.gif Кстати, что такое Крэй?
Ozzя
Цитата(Skrip @ 17.11.04 7:02)
Кстати, что такое Крэй?

Cray - это суперкомпьютеры
http://cs.mipt.ru/docs/comp/rus/develop/pa...vodin/lec2.html
Altair
ТОгдапросто алгоритм неверен.
Цитата
Вводим n. По данному числу n (1<=n<=10000) определить n-ю по счуту цифру в последовательности чисел от 1 до n.

Ьред какой-то, если число n, последовательность до n и вывести надо n-й член последовательности, то это просто последний элемент последовательности.

--
Крэй это древний суперкомпьютер, который мог обрабатывать сразу 8 байт (!) информации, вместо одного.
volvo
Skrip
А сколько цифр содержится в последовательности чисел от 1 до 10000?
1*9 + 2*90 + 3*900 + 4*9000 = 38799... А не 10000, как описано....Может, здесь проблема?

Oleg_Z
Цитата
n-ю по счуту цифру


Это как раз моя программа и делает...
:yes:
Skrip
Цитата
А сколько цифр содержится в последовательности чисел от 1 до 10000?
1*9 + 2*90 + 3*900 + 4*9000 = 38799... А не 10000, как описано....Может, здесь проблема?

Сдесь я точно затупил. Стыд-то какой... unsure.gif
Но прога все равно корректно не работает: то вылетает, то затупает.
Поэтому ее мне придется переписать.
volvo
Skrip
Я же привел пример рабочей программы. Или он тебе не подходит?
Skrip
volvo, прога то подходит, но я должен сделать ее сам. ;)
Romtek
Цитата(Skrip)
прога то подходит, но я должен сделать ее сам

Уважаю!

Операции со строками очень непроизводительны. Более того, они неприменимы при работе с числами !
Altair
Цитата
Уважаю!

И я!
Это замечательно!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.