Помогите в решении простейших задач

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

1) 2^N
Result := 1
for i:=1 to N do
Result := Result * 2;

2) Есть несклолько способов решения. Главный вопрос, как разложить число N на состовляющие цифры. Это можно делать через преобразование числа в строку, потом из строки брать по одному символу, преобразовывать в цифру и проверять, делится ли на 3. это несложно.
но, как мне кажется, проще получать в цикле, пока число больше 10 остаток от деления на 10...
ninjais
Сообщения: 15
Зарегистрирован: 09 сен 2007, 07:28

С первой задачей разобралась, спасибо.
А во второй, если решать с помощью циклов, то каким воспользоваться, что-то я недопонимаю. Циклом с параметром? Я совсем запуталась. Пробовала решать, но ничего не выходит.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

Код: Выделить всё

var
  N, NN : LongInt;
  i, OneDigit, Count_Div3 : integer;
begin
  Readln(N);

  Count_Div3 := 0;
  NN := N;
  while NN > 10 do
  begin
    OneDigit := NN mod 10;
    NN := NN div 10;
    {проверим, что число делится на 3}
    if (OneDigit>0) and ((OneDigit mod 3) = 0) then
      Inc(Count_Div3);
  end;
  {теперь последнюю цифру проверим, что число делится на 3}
  if (NN>0) and ((NN mod 3) = 0) then
      Inc(Count_Div3);
  WriteLn('В числе ',N:1,' количество цифр, делящихся на три = ', Count_Div3:1)

end.
ninjais
Сообщения: 15
Зарегистрирован: 09 сен 2007, 07:28

Спасибо :)
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Serge_Bliznykov писал(а):

Код: Выделить всё

    {проверим, что число делится на 3}
    if (OneDigit>0) and ((OneDigit mod 3) = 0) then
      Inc(Count_Div3);
..................................
  {теперь последнюю цифру проверим, что число делится на 3}
  if (NN>0) and ((NN mod 3) = 0) then
      Inc(Count_Div3);
end.
Вообще-то, насколько я помню математику, ноль также считается делящимся на 3 (и вообще на любое целое число).
Так что, мне кажется, проверку (OneDigit>0) следует убрать:

Код: Выделить всё

    {проверим, что число делится на 3}
    if ((OneDigit mod 3) = 0) then
      Inc(Count_Div3);
..................................
  {теперь последнюю цифру проверим, что число делится на 3}
  if ((NN mod 3) = 0) then
      Inc(Count_Div3);
end.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Ну и, в принципе, "хвост" алгоритма (проверку последней цифры) также можно занести внутрь цикла:

Код: Выделить всё

var
  N, NN : LongInt;
  i, OneDigit, Count_Div3 : integer;
begin
  Readln(N);

  Count_Div3 := 0;
  NN := N;
[b]  while NN > 0 do[/b]   { чуть изменим условие выхода из цикла }
  begin
    OneDigit := NN mod 10;
    NN := NN div 10;
    {проверим, что число делится на 3}
    if  ((OneDigit mod 3) = 0) then
      Inc(Count_Div3);
  end;
  WriteLn('В числе ',N:1,' количество цифр, делящихся на три = ', Count_Div3:1)
end.
Правда, в этом алгоритме не будет отработан краевой случай, когда N =0. Т.е. если исходить из того, что число 0 состоит из одной цифры, которая делится на 9, то данный алгоритм даст неверный результат (0 весто 1) .
Похоже, проблема разрешится сама собой, если просто заменить цикл while На цикл repeat until (предполагая, все-таки, что N - число неотрицательное):

Код: Выделить всё

var
  N, NN : LongInt;
  i, OneDigit, Count_Div3 : integer;
begin
  Readln(N);

  Count_Div3 := 0;
  NN := N;
  repeat
    OneDigit := NN mod 10;
    NN := NN div 10;
    {проверим, что число делится на 3}
    if ((OneDigit mod 3) = 0) then
      Inc(Count_Div3);
  until (NN = 0);
  WriteLn('В числе ',N:1,' количество цифр, делящихся на три = ', Count_Div3:1)
end.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

(немного поимпровизируем :) )

Учитывая, что ЦИФР, делящихся на 3 всего четыре (если считать 0), то условие
if ((OneDigit mod 3) = 0)

можно заменить на:
if (OneDigit in bsDivOn3)

где bsDivOn3 предварительно опсать как:
const bsDivOn3 : set of byte = [0, 3, 6, 9];

Не знаю правда, какой вариант будет эффективнее работать :)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

BBB
снимаю шляпу... ;-))
Тема раскрыта!
Аватара пользователя
Quarter
Сообщения: 4
Зарегистрирован: 24 окт 2007, 20:00

Пожалуйста проверти правильность решения задач.
1)100
Вычислить: S 1/i^2, где S - сумма.
i=1

const n=100;
var i:integer; s:real;
begin
write('s=');
readln(s);
s:=0;
for i:=1 to n do
s:=s+1/i*i;
writeln('s=',s);
end.
2)Дано натуральное n. Сколько цифр в числе n?

var
i,n:LongInt;
begin
Writeln('vvedite chislo');
ReadLn(n);
i:= 1;
while n>=10 do
begin
n:=n div 10;
Inc(i);
end;
Writeln('i=', i);
ReadLn;
end.
3)Даны натуральное число n, действительные числа a[1],...,a[n]. Вы-
числить a[1]+...+a[n].

var
N: integer;
A: array[1..1000] of real;
P: real;
I: integer;
K: real;
begin
Write('N=');
Readln(N);
P:=1;
for I:=1 to N do
begin
Write('Vvedite ',I,'-е chislo A[',I,']=');
Readln(A);
P:=P+A;
end;
K:=Sqrt(Abs(P));
Writeln('K=',K);
ReadLn;
end.
Denton
Сообщения: 9
Зарегистрирован: 25 окт 2007, 19:51

Для созданного текста определить длину содержащейся в нем максимальной серии символов, отличных от букв.
Ответить