Страница 2 из 4

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

Добавлено: 30 сен 2007, 21:43
Serge_Bliznykov
1) 2^N
Result := 1
for i:=1 to N do
Result := Result * 2;

2) Есть несклолько способов решения. Главный вопрос, как разложить число N на состовляющие цифры. Это можно делать через преобразование числа в строку, потом из строки брать по одному символу, преобразовывать в цифру и проверять, делится ли на 3. это несложно.
но, как мне кажется, проще получать в цикле, пока число больше 10 остаток от деления на 10...

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

Добавлено: 01 окт 2007, 05:01
ninjais
С первой задачей разобралась, спасибо.
А во второй, если решать с помощью циклов, то каким воспользоваться, что-то я недопонимаю. Циклом с параметром? Я совсем запуталась. Пробовала решать, но ничего не выходит.

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

Добавлено: 01 окт 2007, 06:40
Serge_Bliznykov

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

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.

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

Добавлено: 01 окт 2007, 19:08
ninjais
Спасибо :)

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

Добавлено: 04 окт 2007, 11:19
BBB
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.

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

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

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

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.

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

Добавлено: 04 окт 2007, 11:30
BBB
(немного поимпровизируем :) )

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

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

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

Не знаю правда, какой вариант будет эффективнее работать :)

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

Добавлено: 04 окт 2007, 21:23
Serge_Bliznykov
BBB
снимаю шляпу... ;-))
Тема раскрыта!

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

Добавлено: 24 окт 2007, 20:20
Quarter
Пожалуйста проверти правильность решения задач.
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.

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

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