
1. дано натуральное к.напечатать к-ю цифру последовательности 12345678910111213, в которой выписаны подряд все натуральные числа.
2. дан текст.определить является ли он правильной десятичной записью целого числа.
! | 1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... |
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.
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
- номер нужного разряда из этого числа*, я просто для удобства число в строку перевел в конце ... ;)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));
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;