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

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

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

 
Closed Topic Открыть новую тему 
> помогите!, паскаль
T@ty@n@
сообщение 12.06.2007 17:51
Сообщение #1


Гость






М wacko.gif может кто занет как решать эти задачи, а то зачет не могу сдать.
1. дано натуральное к.напечатать к-ю цифру последовательности 12345678910111213, в которой выписаны подряд все натуральные числа.
2. дан текст.определить является ли он правильной десятичной записью целого числа.

Сообщение отредактировано: T@ty@n@ - 12.06.2007 17:59
 К началу страницы 
+ Ответить 
klem4
сообщение 12.06.2007 18:04
Сообщение #2


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

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

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


Хм, второе, последнее предупреждение
 ! 
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...



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


Гость






Ну, тему все одно за нарушение Правил закроют... Кстати, Поиск тоже неплохо использовать:

1) Олимпиадные задачи.
Вторая задача тоже решалась...
 К началу страницы 
+ Ответить 
klem4
сообщение 12.06.2007 23:10
Сообщение #4


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

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

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


Мой вариант первой задачи:

function DigitInfo(const k: LongInt): Char;
var
temp, curr, digit_len, digit_owner_number, digit_group: LongInt;
digit_pred_group: LongInt;
s: String;
begin
digit_group := 9;
digit_pred_group := 0;
digit_len := 1;
temp := 9;

while (k > digit_group) do begin
inc(digit_len);
temp := 9 * digit_len * round(exp(pred(digit_len) * ln(10)));
digit_pred_group := digit_group;
digit_group := temp + digit_group;
end;

digit_owner_number := (k - digit_pred_group - 1) div digit_len + 1;
str(round(exp((digit_len - 1) * ln(10))) + digit_owner_number - 1, s);
DigitInfo := s[k - (digit_pred_group + digit_len * (digit_owner_number - 1) + 1) + 1];
end;

var
k: Integer;

begin
readln(k);
writeln(DigitInfo(k));
end.


T@ty@n@ Переименуй название темы ...


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


code warrior
****

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

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


Цитата(klem4 @ 13.06.2007 0:10) *
Мой вариант первой задачи:


А это мой.
Только целочисленная арифметика и никаких str. blum.gif
Код

function GetDigit(k: integer): integer;
var counter: integer;     // счетчик натуральных чисел
    number: integer;      // текущее разбираемое число
    needNewNumber: boolean; // флаг - "завершился ли разбор числа?"
    maxDecimalMask: integer;  // максимальная маска десятичного разряда
    nextDecimalMask: integer; //  maxDecimalMask * 10
    decimalMask: integer;     // текущая маска десятичного разряда

    procedure Init;
    begin
        counter := 0;
        maxDecimalMask := 1;
        nextDecimalMask := maxDecimalMask * 10;
        needNewNumber := true;
    end;

    function GetNextDigit: integer;
    var digit: integer;
    begin
        // получаем следующее натуральное число
        if needNewNumber then begin
            needNewNumber := false;
            inc(counter);
            number := counter;
            if (counter mod nextDecimalMask) = 0 then begin
                maxDecimalMask := nextDecimalMask;
                nextDecimalMask := maxDecimalMask * 10;
            end;
            // сбрасываем маску
            decimalMask := maxDecimalMask;
        end;
        // получаем число в разряде
        digit := number div decimalMask;
        number := number mod decimalMask;
        decimalMask := decimalMask div 10;
        // если маска нулевая, то мы разобрали число
        if decimalMask = 0 then
            needNewNumber := true;
        // возвращаем результат
        GetNextDigit := digit;
    end;

var i: integer;
    digit: integer;
begin
    Init;
    // тупо перебираем k-разрядов
    digit := 0;
    for i := 1 to k do
        digit := GetNextDigit;
    // возращаем результат
    GetDigit := digit;
end;

но с инвариантом ессно красивше получается.

Сообщение отредактировано: hardcase - 13.06.2007 1:36


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 13.06.2007 7:50
Сообщение #6


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

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

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


У мну тоже без строк легко можно ...

round(exp((digit_len - 1) * ln(10))) + digit_owner_number - 1
- это число*, содержаще нужную цифру (при к = 188 или 189 число соодержащее цифру с номером к = 99)

digit_len
- количество разрядов в этом числе (2-3-4-5 значное)

k - (digit_pred_group + digit_len * (digit_owner_number - 1) + 1) + 1
- номер нужного разряда из этого числа*, я просто для удобства число в строку перевел в конце ... ;)

Может кто еще решения предложит ? Интересная задачка smile.gif

Сообщение отредактировано: klem4 - 13.06.2007 7:50


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


Профи
****

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

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


Цитата(klem4 @ 13.06.2007 8:50) *

Может кто еще решения предложит ? Интересная задачка smile.gif

Не догнал с похмелья почему нельзя сделать в лоб blink.gif :

function test (x:longint): char;
var i:longint;
s:string;
begin
i:=0;
repeat
inc (i); str (i,s);
if x<=length(s) then begin
test:=s[x]; x:=0; end else
x:=x-length(s);
until x=0;
end;



Проверка..
for i:=1 to 1000 do write (test(i));

ps без str - + div и mod.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 13.06.2007 14:14
Сообщение #8


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

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

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


да уж)) good.gif


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


code warrior
****

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

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


Цитата(Malice @ 13.06.2007 13:13) *

Не догнал с похмелья почему нельзя сделать в лоб blink.gif

Все познается в сравнении.
Как оно показало - сидение за компом до 3 ночи (я) и похмелье (Malice) ни к чему хорошему не приводят.

Решения "в лоб" редко бывают выигрышными.

Файло в аттаче - консоль на Делфи, сравнивает решения так как мы их запостили на форум.
kelm4 рвет всех good.gif



Прикрепленные файлы
Прикрепленный файл  SlnComp.txt ( 3.78 килобайт ) Кол-во скачиваний: 212


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.06.2007 16:46
Сообщение #10


Гость






hardcase, а ВСЕ решения нельзя было потестить? rolleyes.gif По ссылке в 3-ем посте есть еще 2, кстати.
 К началу страницы 
+ Ответить 
klem4
сообщение 13.06.2007 17:10
Сообщение #11


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

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

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


Цитата
По ссылке в 3-ем посте есть еще 2, кстати.


Ну один из них точно не прокатит, ибо там ограничение на длину строки ...

Цитата
Файло в аттаче - консоль на Делфи, сравнивает решения так как мы их запостили на форум.
kelm4 рвет всех


Неожиданно приятно smile.gif
ps никнейм мой чуть-чуть по другому пишется smile.gif


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


Гость






Андрей, есть просьба: то решение, которое я приводил - было ошибочным, вот корректно работающая версия:

function get_digit(n: longint): char;
var
i: longint;
digits: byte;
start_of, maximal: longint;
num_of_n, num_of_digit: integer;
s: string;
begin
digits := 1;
start_of := 0;

maximal := 9;
while n > digits * maximal + start_of do begin { <--- Строгое неравенство }
inc(digits); maximal := maximal * 10;
inc(start_of, pred(digits) * (maximal div 10));
end;
maximal := maximal div 10;

dec(n, start_of);
num_of_n := (n div digits) + byte((n mod digits) <> 0);
num_of_digit := n - digits * pred(num_of_n);

n := 1;
for i := digits downto 2 do n := n * 10;
str(n + pred(num_of_n), s);
get_digit := s[num_of_digit];
end;


исправь в топике "Олимпиадные задачи"...

Сообщение отредактировано: volvo - 13.06.2007 19:23
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 13.06.2007 23:30
Сообщение #13


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Все, конечно, очень мило, но правила есть правила.
T@ty@n@ внимания на них (и на предупреждения) не обращает.
Тема закрыта...


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

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

 



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