XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Трактир
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
[Pascal] Нахождение цифры по позиции
В общем, сформулирую вопрос так:
Дано n-значное число (причем вводится оно автоматически по заданной закономерности и содержит более 30000 разрядов). Ввод можно осуществить через цикл (тут других вариантов нет). Допустим, закономерность будет такой: 369121518...n (к каждой цифре прибавляется 3). В общем, требуется определить, какая цифра стоит на позиции x (вводится вручную). У кого-нибудь есть предположения?
Мое предположение (по данному примеру):
readln(x);
s:=0;
 while i<=x do
  begin
  s:=s+3;
  str(s,s1);
  i:=i+length(s1);
  end;
Это позволит определить число s на позиции i. Но как определить цифру, хз.
Заранее спасибо
Старый 18.09.2010, 20:02
tysch_tysch
Работаем
offline
Опыт: отключен
число хранится в строке? в чём проблема?
Старый 18.09.2010, 20:22
Омега

offline
Опыт: 12,033
Активность:
Тракторный метод:
const n=100;
var
  x:array[1..n] of longint;
  i:byte;
begin
  x[1]:=369121518;
  for i:=2 to n do
    x[i]:=x[i-1]+3;
  readln(i);
  writeln(x[i]);
  readln;
end.
Старый 18.09.2010, 20:24
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
Омега, в том-то и фишка. В какой-либо тип заносить не надо, просто через цикл проверяем каждое число. Закономерность я представил для примера.
Z, если бы число хранилось в строке, все было бы гораздо проще, но тут разряд числа может доходить до 30000.
WaterMan добавил:
Омега, ты находишь число, а не цифру.
Старый 18.09.2010, 20:25
ScorpioT1000
Работаем
offline
Опыт: отключен
это неверная изначально задача) ну допустим там будет идти
9998 10003 10007
в твоей недостроке это выглядит так
99981000310007
вопрос знатокам - где разделитель ?
Старый 18.09.2010, 20:25
Омега

offline
Опыт: 12,033
Активность:
Задача криво написана.
Старый 18.09.2010, 20:27
tysch_tysch
Работаем
offline
Опыт: отключен
WaterMan, так храни в строке в чём проблема ? о_О
Старый 18.09.2010, 20:28
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
ScorpioT1000, нет, в задаче закономерность другая. Тут роли не играет. Разделителя нет, гарантирую.
WaterMan добавил:
Z, где ты видел строку из 30000 символов? По крайней мере, в паскале.
Старый 18.09.2010, 20:29
Омега

offline
Опыт: 12,033
Активность:
Разряд до 30000, это в смысле может быть число 60000..."еще 29990 нулей"...00000?
Старый 18.09.2010, 20:29
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
Омега, могу предложить пример с цифрой строки Фиббоначчи, разницы нет, ее решить еще сложнее.
Старый 18.09.2010, 20:30
ScorpioT1000
Работаем
offline
Опыт: отключен
тогда тебе надо узнать, сколько цифр будет у каждого из чисел массива
Старый 18.09.2010, 20:30
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
Омега:
Разряд до 30000, это в смысле может быть число 60000..."еще 29990 нулей"...00000?
да, примерно так. Ни один тип не поддерживает такого числа.
Старый 18.09.2010, 20:31
ScorpioT1000
Работаем
offline
Опыт: отключен
т.е.
... 9998 10003 10007 ...
мы храним как
...99981000310007...
и
...,4,5,5,...
чтобы можно было правильно перепрыгивать к новому числу
Старый 18.09.2010, 20:31
Омега

offline
Опыт: 12,033
Активность:
Я так понял, такое титаническое число только в виде текста хранить можно.
Дальше просматривать блоками, скажем, по сотне символов.
Старый 18.09.2010, 20:32
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
ScorpioT1000, я это узнал уже, массив не использовал, переменные просто динамически менял. Но, если он находит число, допустим 123, находящееся на нужной нам позиции (то есть позиция цифры 1 2 или 3), то он в любом случае будет писать 1 (даже если нам требуется 2 или 3, так как цикл прервался, а по окончании осталось число 123).
WaterMan добавил:
ScorpioT1000:
... 9998 10003 10007 ...
мы храним как
...99981000310007...
и
...,4,5,5,...
да, но тогда понадобится массив из 30000, а паскаль с таким массивом работать отказывается.
WaterMan добавил:
Омега:
Я так понял, такое титаническое число только в виде текста хранить можно.
Дальше просматривать блоками, скажем, по сотне символов.
Тогда опять же нужен массив из строк (также надо учитывать что макс. длина строки = 255).
Старый 18.09.2010, 20:36
ScorpioT1000
Работаем
offline
Опыт: отключен
надо не массив, а формулу, чтобы на входе мы принимали индекс числа, скажем, пятое, а на выходе получали число цифр у него.
и начинаем считать т.е. сначала первое, у его одна цифра, сдвигаем на 1, дальше второе, у него одна, сдвигаем на 1,... потом десятое, у него 2 цифры, сдвигаем на 2 и так идём до i элемента, который надо было запросить, достаем все цифры и переводим в int
Старый 18.09.2010, 20:38
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
и так идём до i элемента, который надо было запросить, достаем все цифры и переводим в int
так примерно я и писал, но тут возникает проблема
Но, если он находит число, допустим 123, находящееся на нужной нам позиции (то есть позиция цифры 1 2 или 3), то он в любом случае будет писать 1 (даже если нам требуется 2 или 3, так как цикл прервался, а по окончании осталось число 123).
Даже если вытащить все цифры нужного нам числа (то есть нужная цифра находится в числе 123), то тут получается цикл закончен, а на выходе мы получили 3 цифры, причем не знаем, какая из них нам требуется.
Старый 18.09.2010, 20:43
GadenbIsh
Просто Гад
offline
Опыт: 70,430
Активность:
сделай простой линейный список (ну, т.е. структура: цифра и ссылка на следующую такую же структуру) тогда уж, ты сможешь записать туда любое число, сколько у тебя только оператива позволяет
Старый 18.09.2010, 21:07
ScorpioT1000
Работаем
offline
Опыт: отключен
WaterMan, ты чтото тупишь, не знаю че там у тебя с циклами, но там явно должно быть что-то больше чем просто строка, заполненная цифорками, как минимум алгоритм построения этих циферок.
грубо говоря на таком "псевдокоде" получится вот что:
функция 1: int GetFigureNumById(int id) // "формулу, чтобы на входе мы принимали индекс числа, скажем, пятое, а на выходе получали число цифр у него."
{
//реализация зависит от формулы заполнения
}

функция 2: int GetNumberById(string s, int id) // вот она будет давать нам результат - число по его номеру в массиве (не путать с индексом)
{
int i=0 // настоящая ячейка (т.е. по цифрам)
int idx=0 // ячейка по числам (т.е. прыгаем между числами, а не цифрами)
int len = //ну типа длина строки в ячейках
while(i<len) { // пока не дошли до конца
  if(idx < id) { // если номер текущего числа меньше того, которое надо извлечь
    i = i + GetFigureNumById(idx) // прибавляем кол-во цифр у текущего числа
    idx = idx + 1 // двигаемся к след. числу
  } else { // пришли к тому числу, которое надо
    //просто отсчитываем от i до GetFigureNumById(idx) и получаем диапазон цифр (в строке), которые принадлежат именно нужному числу idx 
    // и возвращаем его как уже нормальное число
  }
}
return 0 //на всякий случай..
}
Старый 18.09.2010, 21:29
Ответ

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

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

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 06:33.