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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 12:56   #11
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Мдя... мне не понять...
Ромаха имеет в виду, что изначально у нас нет массива, а есть один сплошной поток натуральных чисел без всяких разделителей между ними. И нужно вывести n-ную цифру этого потока. Вариант с массивом или строкой его, я понимаю, не устраивает ввиду очевидной простоты решения.

Цитата:
Супер!! 10 букоф
ну и зря. Код то косячный Введи n=20 и посмотри, какая там цифра
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.03.2013 в 13:02.
Sciv вне форума Ответить с цитированием
Старый 29.03.2013, 12:57   #12
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Мы сами должны сгенерировать это строку и вывести её N-ый символ
эээ... А что если так
Код:
// Получаем строку S

WriteLn(S[n]);
?
Вадим Мошев вне форума Ответить с цитированием
Старый 29.03.2013, 12:58   #13
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Вадим, все бы хорошо, если бы не
Цитата:
Вариант с массивом или строкой его, я понимаю, не устраивает ввиду очевидной простоты решения.
Poma][a вне форума Ответить с цитированием
Старый 29.03.2013, 13:19   #14
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Помнится нечто подобное попадалось на олимпиаде, задачка из разряда
В строку выписано бесконечное количество чисел по определенному закону (в данном случае просто инкремент), определить n-ую цифру в такой строке. Для небольших значений n задачка простая, но вот самый интерес начинается для больших чисел + ограничения работы по времени и по отжираемой памяти

Навскидку, мысль такая:
весь ряд можно четко разложить на группы
9 знаков - однозначные числа
180 знаков - двузначные итд...
В первую очередь по n определяем, к какой группе относится эта позиция

Например n=100
n>9<9+180, т.е. в этой позиции какое-то двухначное число
Затем определяем какое именно число
100-9=91 \ 2 = 45, т.е. это 45ое двухначное число
91 % 2 = 1, то есть первая цифра этого числа (длля последней - остаток 0)
45-ое двухначное число - это 54, его первая цифра - 5, вот и ответ

P.S. за точность не ручаюсь, просто мысль

Аналогичный пример для n=3000
1) Расчет групп (10^g-10^(g-1))*g - количество количество символов в группе g-значных чисел
N=3000 попадает в группу 4-хзначных чисел
2) Вычитаем из n сумму длин групп 1,2 и 3-значных чисел (9+180+2700=2889, 3000-2889=111)
3) Остаток от деления на 4 = 3, , то есть третья цифра числа
4) Целая часть от деления на 4 = 27, то есть это 27-ое четырехзначное число (1026)
5) Третья цифра - 2

Проверьте меня кто-нибудь, пожалуйста)
благодарность - сюда (не забываем писать от кого)

Последний раз редактировалось Zer0; 29.03.2013 в 13:42.
Zer0 вне форума Ответить с цитированием
Старый 29.03.2013, 13:35   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
есть один сплошной поток натуральных чисел
Ну так в том то и дело что он есть. А поток это что? Пра-а-а-вильно: массив данных.
Дурацкая задача получается - данные уже есть, но пока что их нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2013, 13:45   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Zer0, очень интересный алгоритм, спасибо!

вполне возможно, что авторы предполагали решение данной задачи "в лоб".
Примерно, как в этой теме: Дано натуральное k. Напечатать k-ю цифру последовательности 149162536..., в которой выписаны подряд квадр
(см. мой пост #4)

Дело в том, что современные процессоры ну ОЧЕНЬ быстрые...
и моргнуть не успеешь, как они цикл от 1 до миллиона прокрутят!
А память особо выделять не надо - перевели текущее число в строку, нарастили длину общей строки, а сохранять всю последовательность в памяти - это нам совсем НЕ НУЖНО! Нужно дождаться, когда длина дойдёт до нужного N и всё!


а вот на форуме ещё такую аналогичную задачу решали:
цифра, которая находится в k-той позиции последовательности

Последний раз редактировалось Serge_Bliznykov; 29.03.2013 в 13:53.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.03.2013, 14:21   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var k,m,n,s1,s2,t: Int64;
    c1: String;
begin
  m:=151120;  //позиция
//Аналитически
  s2:=0;
  k:=0;
  n:=1;
  while s2<m do begin
    Inc(k);
    s1:=s2;
    s2:=s2+9*k*n;
    n:=n*10;
  end;
//  t:=(m-s1-1) div k;
  c1:=IntToStr((n div 10)+((m-s1-1) div k));
  Label1.Caption:='Число '+c1;
  Label2.Caption:='В позиции '+IntToStr(m)+' цифра '+c1[m-s1-((m-s1-1) div k)*k];
//Проверка для убедительности в лоб
  c1:='';
  k:=1;
  while Length(c1)<m do begin
    c1:=c1+IntToStr(k);
    Inc(k);
  end;
  Label3.Caption:='Число '+IntToStr(k-1);
  Label4.Caption:='В позиции '+IntToStr(m)+' цифра '+c1[m];
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.03.2013 в 14:30.
Аватар вне форума Ответить с цитированием
Старый 29.03.2013, 14:22   #18
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Во! Кажись нашел ошибку с своей голове!

Код:
if n<10 then writeln(n) 
else if (n>=10) and (n<190) then begin
  if not odd(n) then writeln(n div 10-n div 20) 
  else begin
    if odd(n div 10) then  writeLn(n mod 10 div 2)
    else WriteLn(n mod 10 +(9 - n mod 10) div 2);
  end;
end;
Для последовательного натурального ряда двухзначных чисел работает вроде бы...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.03.2013 в 15:02.
Sciv вне форума Ответить с цитированием
Старый 29.03.2013, 18:17   #19
interacia
Пользователь
 
Аватар для interacia
 
Регистрация: 24.01.2013
Сообщений: 67
По умолчанию

Без массивов строк и пр. Прямое вычисление цифры в последовательности по известному N (номеру).
Код:
program zadacha28;
var
N:integer; 
otvet:integer;
Sum:longint;
i:integer;
j:integer;
temp:longint;
HisloScifroy:integer;
cifraVhisle:integer;
begin
write('Vvedite N');
readln(N);
i:=1;
Sum:=10;
temp:=10;
while Sum<=N do
begin
temp:=temp*10; 
inc(i);
Sum:=Sum+temp*(i); 
end;
j:=i;
N:=N-(Sum-temp*(i)); 
temp:=0;
if j>1 then begin
temp:=1;
for j:=2 to i do temp:=temp*10; 
end;
HisloScifroy:=temp+((N) div i); 
cifraVhisle:=N mod i; 
for j:=1 to i-cifraVhisle-1 do HisloScifroy:=HisloScifroy div 10;
otvet:=HisloScifroy mod 10;
writeln('Otvet :',otvet);
end.
interacia вне форума Ответить с цитированием
Старый 30.03.2013, 16:20   #20
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

День добрый.
Дико извиняюсь за супер скоростной ответ..

Цитата:
Расчет групп (10^g-10^(g-1))*g
А вот это уже точно супер!
Цитата:
Дело в том, что современные процессоры ну ОЧЕНЬ быстрые...
и моргнуть не успеешь, как они цикл от 1 до миллиона прокрутят!
А память особо выделять не надо - перевели текущее число в строку, нарастили длину общей строки, а сохранять всю последовательность в памяти - это нам совсем НЕ НУЖНО! Нужно дождаться, когда длина дойдёт до нужного N и всё!
Точняк! Спасибо!

Аватар, а не могли бы Вы чуть-чуть прокомментировать этот кусок кода :

Код:
 m:=151120;  //позиция
//Аналитически
  s2:=0;
  k:=0;
  n:=1;
  while s2<m do begin
    Inc(k);
    s1:=s2;
    s2:=s2+9*k*n;
    n:=n*10;
  end;
//  t:=(m-s1-1) div k;
  c1:=IntToStr((n div 10)+((m-s1-1) div k));
  Label1.Caption:='Число '+c1;
  Label2.Caption:='В позиции '+IntToStr(m)+' цифра '+c1[m-s1-((m-s1-1) div k)*k];
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная задача makskovalko Помощь студентам 13 25.01.2013 11:29
интересная задача Erkesh Помощь студентам 1 03.11.2012 16:19
Интересная задача makskovalko Помощь студентам 6 12.08.2012 18:47
интересная задача Знаменок Паскаль, Turbo Pascal, PascalABC.NET 0 05.10.2010 13:26
Интересная задача! - DannerDOS.kz Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 14:04