Помощь - Поиск - Пользователи - Календарь
Полная версия: Разложение числа на цифры
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kr3v3tkus
Посмотрите пожалста задачу, я уже в поиске искал. но там выдаёт такое разбивание числа типа 6=5+1 или сумма чисел в массиве, а мне надо типа 605=6+0+5. Вся трудность в том, что я не знаю как применить свойство мода и дива для множества чисел sad.gif я знаю, что чтобы получить например 2 из 123
нужно сделать (123 div 10) mod 10, но если у нас есть такое число - 1234, то ведь надо например для 1 делать просто div 1000, для 2 и див и мод ну и т.д.
Помогите или пошлите в пример плз unsure.gif

Составить программу нахождения среднего арифметического значения цифр заданного натурального числа N (1<N<1000000000).

Код
program lol;
var n:longint;
      k,s:integer;
begin
k:=1;
s:=0;
z:=n;
writeln('vvesti 4islo');
readln(n);
writeln;
if (n>1)and(n<1000000000) then  {'условие для n'}
  begin

    while z>=10 do  {'здесь идёт вычисление из скольки цифр состоит число'}
      begin
        z:=z div 10;
        k:=k+1;
      end;

  begin  {' !!! а здесь надо найти сумму состовляющих число цифр'}
    while i<=k do

  end;

  end;
else writeln('neprav1ln1y argyment');
readln;
end.
volvo
А ты сразу сумму цифр найти не можешь?
  while n <> 0 do begin
s := s + (n mod 10);
n := n div 10;
end;
kr3v3tkus
volvo
так а ведь если число например 9значное(123456789)
1 s:=0+23456789
n:=12345678
получается так например для 1го
а мне надо типа
1 s:=0+1
n:=2
2 s:=1+2
n:=3
типа это надо, или ты имееш ввиду както связать это с тем где находится количество цифр в числе?
Alex7
Цитата
Составить программу нахождения среднего арифметического значения цифр заданного натурального числа N (1<N<1000000000).

Значит скажем так.
Есть у меня такая(ну, почти) работающая програма, но написано очень коряво, ибо давно и на тупую голову. yes2.gif
Если чо поймешь, то можешь взять с нее куски:
Код
program suma_cifr_4isel_ta_porivnyannya_sum;
var n1,s1,n2,s2:longint;
    a1,a2:byte;
label xxx1, sp1, xxx2, sp2;
begin
     writeln ('Rozrahunok sum cifr dvoh 4isel ta porivnyannya');
     repeat
     write ('Vvedit" 4isla A,B (4erez probil) - ');
     readln (n1,n2);
     if (n1<0) or (n2<0) then writeln ('Dani vvedeno nepravilno');
     until (n1>=0) and (n2>=0);
     s1:=0;
         xxx1: begin
         a1:=n1 mod 10;
         s1:=s1+a1;
         n1:=n1 div 10;
         if n1>10 then goto xxx1;
         if n1<10 then goto sp1;
         sp1:
         s1:=s1+n1;
         writeln;
         writeln('Suma cifr 4isla A = ',s1);
         end;
     s2:=0;
         xxx2: begin
         a2:=n2 mod 10;
         s2:=s2+a2;
         n2:=n2 div 10;
         if n2>10 then goto xxx2;
         if n2<10 then goto sp2;
         sp2:
         s2:=s2+n2;
         writeln('Suma cifr 4isla B = ',s2);
         end;
         writeln;
         write ('  Porivnyannya:');
         if s1-s2<0 then write (' A < B') else
         if s1-s2=0 then write (' A = B') else
         write (' A > B');
         readln
end.

Главнгое чо хочу сказать, так это то что
Код
while z>=10 do  {'здесь идёт вычисление из скольки цифр состоит число'}
      begin
        z:=z div 10;
        k:=k+1;
      end;

по моему не правиьно организовано, см. мою прогу→ там я использу. mod 10 чтобы получить последнюю цифру числа.
-=еще раз извиняюсь за корявую програму- нету времени щас переделывать=-
volvo
Ты нормально задание написать можешь? Что тебе надо, конкретно? Ты писал про сумму цифр числа, я привел тебе фрагмент программы, который эту сумму находит, теперь ты опять что-то начинаешь придумывать...

Сумма цифр числа n = 1234567 равна 28 и ничему другому... Если тебе нужно не это, то будь добр привести пример входного и выходного значения (с объяснением)... Телепатов здесь нет.
kr3v3tkus
2 volvo
Цитата
Сумма цифр числа n = 1234567 равна 28 и ничему другому

нуда мне это и нужно
Цитата
а мне надо типа 605=6+0+5

извини, я просто не понял применится ли
Код
while n <> 0 do begin
s := s + (n mod 10);
n := n div 10;
end;

к числу 1234567? ну если трассировать то ведь вроде получается так
1 s:=s+(n mod 10) {s=0+1234567 mod 10 => s=0+234567}
n:= n div 10 {s=123456}
так? извини конечно если я ошибаюс smile.gif голова уже пухнет smile.gif

2 Alex7
сенка, конечно туманно, но ща попробую раскурочить smile.gif
kr3v3tkus
2 volvo
ёёёё блин пардон , фсё крыша летит wacko.gif ёлки палки пол дня думал ))) мне почемуто казалось, что
оно находит не 1 цифру а несколько )
сори я ваще касячу (
Alex7
Цитата
1 s:=s+(n mod 10) {s=0+1234567 mod 10 => s=0+234567}

Не так.
Вот так:
1 s:=s+(n mod 10) {s=0+1234567 mod 10 => s=0+7} 

Т.Е. mod тебе выдает в результате ту цифру, которая не поделилась нацело на 10(на 10 могут нацело делится числя больше 10, а так, как у нас большое число, то его младшая цифра- единичная не делится, вот ее и получаем).
Выполняя циклично этоту операцию ты получишь сумму цифр твоего числа, только тебе нужео запоминать значение n, чтобы в следушем цикле уже модить меньшее число(уже без последней цифры) и т.д.
Короче
Код
while n <> 0 do begin
s := s + (n mod 10);
n := n div 10;
end;

Очень правильное и оптимаьное решение.

Думаю как находить среднее значение тебе не нужно писать, сам не балбесс lol.gif , тем более уже утро... good.gif
Анастасия
Это по поводу нахождения количества цифр, суммы цифр и переворачивания цифр. Получается так у меня:
Код

program kkk;
uses crt;
var i,t,s,k,m:integer;u:string;
BEGIN
clrscr;
writeln('vvedi chislo ');
readln(u);{!!!! -вот что надо читать - сразу строковую величину в цифрах}
s:=0; {kolichestvo zifr}
t:=0; {suma zifr}
for i:=1 to length(u) do
begin
s:=s+1;val(copy(u,i,1),k,m);
t:=t+k;
end;
writeln( 'kolichestvo zifr = ', s);
writeln( 'suma  zifr = ', t);
write('perevernutoe chislo  = ');
for i:=length(u) downto 1 do
begin
write(copy(u,i,1));
end;
end.

Хотя и понимаю , что не логично вводить цифру строкой.
volvo
Цитата
Может нельзя моим способом решать...
Нельзя, конечно... Ты же читаешь число, а все лидирующие нули просто удаляются и не принимаются в расчет. Если хочешь, вводя 009 получать "перевертыш" равный 900, тебе надо вводить информацию сразу в виде строки...

Кстати, ты на дату смотрела? Теме, извини, скоро ГОД...

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