IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> ПРОГРАММА НА ПАСКАЛЕ, КВАДРАТЫ
сообщение
Сообщение #1


Гость






ПОМОГИТЕ РЕШИТЬ НА ПАСКАЛЕ
Бесконечная последовательность цифр составлена из записанных друг за другом квадратов всех натуральных чисел, начиная с единицы: 149162536…… Требуется определить, какая цифра находится на k- месте в этой последовательности.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(СТАРШИНА @ 8.11.2007 12:04) *

149162536…… Требуется определить, какая цифра находится на k- месте в этой последовательности.

Каков верхний предел для k?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


один из вариантов
uses crt;

function digit(value: LongInt; digit_num: Byte): Byte;
begin
while digit_num > 0 do begin
value := value div 10;
dec(digit_num);
end;
digit := value mod 10;
end;

function DigitsCount(n: LongInt): Byte;
var
count: Byte;
begin
count := 0;

while n > 0 do begin
inc(count);
n := n div 10;
end;

DigitsCount := count;
end;

function GetDigit(const k: LongInt): LongInt;
var
s, i: LongInt;
begin
s := 1;
i := 2;

while (s < k) do begin
s := s + DigitsCount(i * i);
i := i + 1;
end;

GetDigit := digit(pred(i) * pred(i), abs(s - k));
end;

var
k, i: LongInt;

begin

clrscr;

write('k = '); readln(k);

writeln('result = ', GetDigit(k));
writeln;

for i := 1 to 1000 do begin // можно увеличивать ... это для наглядности
if i = k then TextColor(Red) else TextColor(White);
write(GetDigit(i));
if i mod 70 = 0 then writeln;
end;
readln;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Lapp @ 9.11.2007 11:08) *

Каков верхний предел для k?

Верхний предел k< (2 в степени 31)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(klem4 @ 10.11.2007 12:37) *

один из вариантов
uses crt;

function digit(value: LongInt; digit_num: Byte): Byte;
begin
while digit_num > 0 do begin
value := value div 10;
dec(digit_num);
end;
digit := value mod 10;
end;

function DigitsCount(n: LongInt): Byte;
var
count: Byte;
begin
count := 0;

while n > 0 do begin
inc(count);
n := n div 10;
end;

DigitsCount := count;
end;

function GetDigit(const k: LongInt): LongInt;
var
s, i: LongInt;
begin
s := 1;
i := 2;

while (s < k) do begin
s := s + DigitsCount(i * i);
i := i + 1;
end;

GetDigit := digit(pred(i) * pred(i), abs(s - k));
end;

var
k, i: LongInt;

begin

clrscr;

write('k = '); readln(k);

writeln('result = ', GetDigit(k));
writeln;

for i := 1 to 1000 do begin // можно увеличивать ... это для наглядности
if i = k then TextColor(Red) else TextColor(White);
write(GetDigit(i));
if i mod 70 = 0 then writeln;
end;
readln;
end.


Спасибо!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(старшина @ 15.11.2007 8:53) *

Верхний предел k< (2 в степени 31)

То есть примерно 2 000 000 000, или весь диапазон LongInt.
klem4, твой вариант у меня сорвался на k = 500 000 .. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 15.11.2007 9:20) *

То есть примерно 2 000 000 000, или весь диапазон LongInt.
klem4, твой вариант у меня сорвался на k = 500 000 .. smile.gif

Нужен весь диапазон LongInt.
Тесты обычно бывают на самые последние позиции.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






В принципе, воспользовавшись вот этой последовательностью:
Number of squares (of positive integers) with n digits (или формулой, приведенной там же) реально практически мгновенно найти число, в квадрате которого будет находиться искомая цифра, и собственно номер цифры в этом числе... Основную сложность представляет возведение числа в квадрат (скажем, для получения 2147483645-ой цифры заданной последовательности надо будет найти седьмую цифру 17-значного числа 1329850662)...

Сомневаюсь, что есть способы это сделать, кроме использования длинной арифметики, но тут надо смотреть на скорость других методов (без использования последовательности A049415)...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.12.2021 17:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name