Помощь - Поиск - Пользователи - Календарь
Полная версия: Паскаль. массивы.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
aigulia
Помогите написать программы на Паскале! Сама в этом не разбираюсь, по этому прошу вашей помощи! Заранее спасибо!!

1. Если уравнение ax2 + bx + c = 0 (a не равно 0) имеет вещественные корни, то логической переменной t присвоить значение true, а переменным x1 и x2 – сами корни, иначе же переменной t присвоить false, а значения переменных x1и x2 не менять.
2. Дано 50 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к какому-нибудь целому числу.
3. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.
4.Даны целые числа x1, x2, …, x55. Вычислить величину
x1(x2+x3)(x4+x5+x6)(x7+x8+x9+x10)…( x46+x47+…+x55).
TarasBer
> Сама в этом не разбираюсь, по этому прошу вашей помощи!

Зря. Начали бы сами, помогли бы нормально. А так...

Специально напишу не на паскале, а на псевдокоде. Чтобы вам было, над чем подумать.
И правильность не проверял.

1.
Код

d := b^2-4ac; дискриминант
if d >= 0
  t := true;
  s := sqrt(d);
  x1 := (-b-s)/2a;
  x2 := (-b+s)/2a;
else
  t := false;
end if

2.
Код

for i from 0 upto 49
  ad := abs(M[i] - N); расстояния от текущего элемента массива до того числа
  if i = 0 or d > ad
    MinIndex := i;
    d := ad;
  end if;
end for;

3.
Код

N := 0;
L := 1;
M := 9;
while K > N     вычисление первой степени десятки, запись до которой содержит хотя бы K цифр
  ON := N;
  N := N + M * L;
  L := L + 1;
  M := M * 10;
end while;
RN := (K - ON - 1) div (L - 1) + M div 90;   вычисление числа, в запись которого попала K-я цифра
RD := L - 2 - (K - ON - 1) mod (L - 1);       порядковый номер цифры в числе
for i from 0 upto RD
  RN := RN div 10;
end for
Result := RN mod 10;

4.
Код

P := 1;
S := 0;
N := 1;
K := 2;
for i from 1 upto 55
  S := S + X[i];  временная сумма
  if i = N        номер элемента, в котором надо обнулить временную сумму
    P := P * S;   ответ
    S := 0;
    N := N + K;
    K := K + 1;
  end if;
end for
Lapp
По 4-й задаче: я б сделал вот так:
  p:=1;
for i:=1 to 10 do begin
s:=0;
for j:=1 to i do s:=s+x[(i-1)*i div 2+j];
p:=p*s
end;



P.S.
"псевдокод" я бы не приветствовал на форуме по Паскалю.. Правильно оформить реальный кусок кода - уже некоторая задача для новичка. Если недостаточно - есть и другие способы усложнить..
Lapp
3-я задача тоже интересная. Я написал, потом стал смотреть решение TarasBer'а. Выяснилось, что ход решения практически тот же )). Потом я все же дал себе труд перевести этот "псевдокод" на Pascal, и - результат негативный ((. TarasBer, ищи ошибку. Мне кажется, ты запутался в последних подсчетах, но настаивать не буду..
Lapp
Во 2-й задаче, TarasBer, ты несколько не понял условие.. Нужно искать число, максимально близкое к любому (не важно, какому именно) целому.

Млжно примерно вот так:
  for i:=1 to 50 do a[i]:=Random*100;    {задаем массив вещественных чисел от 0 до 100}
d:=1.0; {подготавливаем минимальное расстояние}
for i:=1 to 50 do if Abs(a[i]-Round(a[i]))<d then m:=i; {поиск}
WriteLn('самое близкое к целому - число ',a[m],' под номером ',m); {вывод результата}
TarasBer
> for i:=1 to 50 do if Abs(a[i]-Round(a[i]))<d then m:=i;

А кто будет менять d?


for i := 1 to 50 do begin
ad := Abs(a[i] - Round(a[i]));
if (i = 1) or (ad < d) then begin
m := i;
d := ad;
end;
end;



> По 4-й задаче: я б сделал вот так:

Да, так лучше, тут я сбыдлокодил.

> Потом я все же дал себе труд перевести этот "псевдокод" на Pascal, и - результат негативный ((. TarasBer, ищи ошибку. Мне кажется, ты запутался в последних подсчетах, но настаивать не буду..

Очень может быть. Надо посмотреть. Вообще, конечно, можно тупо писать по очереди в строку, пока её длина не превысит k (чтобы память не тратилась, можно только запоминать длину, а строку заново переписывать для каждого числа), но это другой порядок скорости - O(n) вместо логарифма, мне это не нравится.
TarasBer
Попробовал

for i := 0 to RD do RN := RN div 10;

Заменить на

for i := 0 to RD - 1 do RN := RN div 10;

Так лучше. Прогнал до k=1000, вроде достоверно.
volvo
Цитата
3. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.
Задача решалась, причем не одним пользователем на этом форуме (См. Олимпиадные задачи, пост №15). Прежде всего надо было обратиться к поиску. Автор даже этого не сделал. Надо ему очень эти фрагменты решений? От сейчас их возьмет и пойдет на другой форум. А там ему слепят из них очередного монстра... "Псевдокод"... Я тебе, TarasBer, тоже как-нибудь отвечу с использованием псевдокода. Посмотрим, сколько тебе времени понадобится, чтобы разобраться и перенести решение на любой другой язык...
Lapp
Цитата(volvo @ 23.04.2010 11:24) *
Задача решалась, причем не одним ...
Автор даже этого не сделал. Надо ему очень эти фрагменты решений?
volvo, я не думаю, что ты думаешь, что я думаю, что эта задача не решалась )). Но дело же не в этом..
В конце концов, главное - потрепаться, и чтоб задача была хорошая )). А что до автора - ну, ну.. ну - чиво тут поделаешь?.. СУДБА..

TarasBer, спасибо за поправку. И обрати внимание на слова volvo по псевдокоду тоже (я не одинок)).
Халявов
Цитата(aigulia @ 22.04.2010 19:14) *
Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа.

Задачка из Пильщикова
Var K,
CurrentQuantitySymbol,
CurrentInteger,
PowerCurrentInteger:integer;
KSymbol:0..9;
BEGIN
Write('Введите K ');
Readln(K);
CurrentInteger:=1;
PowerCurrentInteger:=10;
CurrentQuantitySymbol:=1;
while K>CurrentQuantitySymbol do
begin
K:=K-CurrentQuantitySymbol;
CurrentInteger:=CurrentInteger+1;
if CurrentInteger=PowerCurrentInteger then
begin
CurrentQuantitySymbol:=CurrentQuantitySymbol+1;
PowerCurrentInteger:=PowerCurrentInteger*10
end
end;
for K:=K to CurrentQuantitySymbol-1 do
CurrentInteger:=CurrentInteger div 10;
KSymbol:=CurrentInteger mod 10;
Writeln(KSymbol)
END.


Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.