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

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

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

> ПРОГРАММА НА ПАСКАЛЕ, КВАДРАТЫ
СТАРШИНА
сообщение 8.11.2007 12:04
Сообщение #1


Гость






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


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

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

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


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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 10.11.2007 12:37
Сообщение #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 
 К началу страницы 
+ Ответить 
старшина
сообщение 15.11.2007 8:53
Сообщение #4


Гость






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

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

Верхний предел k< (2 в степени 31)
 К началу страницы 
+ Ответить 
старшина
сообщение 15.11.2007 8:58
Сообщение #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.


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


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

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

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


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

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

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


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





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

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


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

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

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


Гость






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

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

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

 



- Текстовая версия 19.07.2025 18:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"