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

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

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

> помогите!, паскаль
сообщение
Сообщение #1


Гость






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

Сообщение отредактировано: T@ty@n@ -
 К началу страницы 
+ Ответить 
 
Closed Topic Открыть новую тему 
Ответов
сообщение
Сообщение #2


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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


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 -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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