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

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

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

> помогите!, паскаль
T@ty@n@
сообщение 12.06.2007 17:51
Сообщение #1


Гость






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

Сообщение отредактировано: T@ty@n@ - 12.06.2007 17:59
 К началу страницы 
+ Ответить 
 
Closed Topic Открыть новую тему 
Ответов
klem4
сообщение 12.06.2007 23:10
Сообщение #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 
 К началу страницы 
+ Ответить 
hardcase
сообщение 13.06.2007 1:28
Сообщение #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 - 13.06.2007 1:36


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

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


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

 



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