Змінюй хід війни! Допомагай ЗСУ!

Pascal , покажите где ошибка ?

  • Автор теми Автор теми Honorocker
  • Дата створення Дата створення
ну с таким успехом тогда вообще все числа в мире делятся одновременно на 3 и 4 :D
.
после такого утверждения ваш смех закономерен и понятен, я рад, что чувство юмора у вас есть
причём тут сомножители, если цикл всё равно все числа будет перебирать? ты вообще предлагаешь ещё дольше сделать, у тебя получится два цикла, первый на 200, а второй на 16.

какие 2 цикла, вы вообще читать умеете? код еще раз посмотреть бы не мешало там ровно 17 итераций
 
причём тут сомножители, если цикл всё равно все числа будет перебирать? ты вообще предлагаешь ещё дольше сделать, у тебя получится два цикла, первый на 200, а второй на 16.

покажи где там цикл "первый на 200"
тут один цикл на 16 элементов (17 если считать ноль)


ну по сути, это уберет только иф и сделает цикл еще проще и быстрее, кстати, интересно, что вычислительно сложнее, цикл с 200 итерациями, или с 16, но с более сложным условием?

Проще if вынести за пределы цикла и не забивать голову ;)
и нок а не нод :)
хотя думаю ноль тоже считать надо

$sum = 0;
$num = 0;
$low_lim = -100;
$high_lim = 100;
$nok = 12;
for ( $i=round($low_lim/$nok); $i <= round($high_lim/$nok); ++$i )
{ $sum +=$i; ++$num; }
if ( $low_lim <= 0 && $high_lim > 0)
--$num;
print $sum*$nok;
print $num;
 
Читайте задания хорошо, люди к вам потянутся.
В задании нигде не указано, что надо найти эти числа
Итого имеем - находимя числа a1,a2,...,ax
Потом программа Writeln('Sum is ', a1 + a2 + ax);
Ессно вписываем реальные числа. 1 Строчка, и все в точности по ТЗ.
 
можно циклом while пройти, увеличивая счетчик не на 1, а на 12, как только нашлось первое число. (либо for... step)
 
Вот так и рождаются супер оптимизированные крутые программы, логику работы которых может понят только их разработчик.
 
ничего сложного в алгоритме не вижу. а также, кроме всего прочего, на 4 и 3 делятся только ЧЕТНЫЕ числа, поэтому от -150 можно идти шагом 2, таким образом, половина времени сокращается
 
а также, кроме всего прочего, на 4 и 3 делятся только ЧЕТНЫЕ числа, поэтому от -150 можно идти шагом 2, таким образом, половина времени сокращается

но для общего случая такой вариант не годится. Или необходима дополнительная логика определения шага.
 
Да не надо никакого шага. Всё решается без циклов.
 
Я просто сказал это с точки зрения оптимизации. например, если диапазон от -50 до 150, можно сразу начинать считать от 51 до 150
а как же количество? :rolleyes:

какие 2 цикла, вы вообще читать умеете? код еще раз посмотреть бы не мешало там ровно 17 итераций
чего-то я не увидел на паскале такого кода.

ничего сложного в алгоритме не вижу. а также, кроме всего прочего, на 4 и 3 делятся только ЧЕТНЫЕ числа, поэтому от -150 можно идти шагом 2, таким образом, половина времени сокращается
а если там будет другой диапазон и другие числа на которые делить надо будет, то ты собираешься программу переписывать? Я не пойму, ты математик или программист? Надо вообще сразу же универсальную программу написать, чтобы пользователь сам исходные данные вводил.
 
чего-то я не увидел на паскале такого кода.
и от этого там сразу второй цикл появился?
все конструкции стандартны переведите на паскаль и будет Вам счастье.
Алгоритм от языка не зависит.

мне лень вспоминать паскаль.

PS: кстати предел цикла нужно вынести в отдельную переменную.
PPS: и округлять строго вниз иначе можно насчитать лишнее.

to ASokol:
видел несколько часов назад Вы даже код своего решения выкладывали, отчего ж удалили?
 
"В диапозоне от -100..100 посчитать количество и сумму чисел деляшихся одновременно на 3 и 4"
не найти числа и посчитать, а посчитать
о чем речь?
 
Тут надо описать случай, когда из некоторого контейнера, содержащего разнородные, несистематизированные обьекты по некоторому признаку выбирается иформация и подается на абстрактный вывод :о
 
Код:
procedure CalcSumAndCount(pRangeFrom, pRangeTill, pDivisor: integer; var pCount, pSumm: integer);
var
  lRangeFrom, lRangeTill: integer;
begin
  pCount := (pRangeTill div pDivisor) - ((pRangeFrom - 1) div pDivisor);

  lRangeFrom := (pRangeFrom div pDivisor + integer(pRangeFrom mod pDivisor <> 0)) * pDivisor;
  lRangeTill := (pRangeTill div pDivisor) * pDivisor;

  if lRangeFrom = 0 then lRangeFrom := pDivisor;
  if lRangeTill = 0 then lRangeTill := pDivisor;

  pSumm := trunc((lRangeFrom + lRangeTill) / 2) * pCount;
end;

Вот универсальный алгоритм, для любых диапазонов и делителей. Правда действует только для положительных чисел. То есть если надо посчитать от -90 до 100, то всё довольно просто

Код:
CalcSumAndCount(0, 90, 12, lCount1, lSumm1);
CalcSumAndCount(0, 100, 12, lCount2, lSumm2);

Такие дела ;)
 
"В диапозоне от -100..100 посчитать количество и сумму чисел деляшихся одновременно на 3 и 4"
не найти числа и посчитать, а посчитать
о чем речь?

уже сто раз посчитали.
чисел 16 ( с нулём 17)
сумма 0

но лишь от того что ТЗ написано криво вовсе не значит что нужно и программу писать также.

Тут интересен сам процесс а не результат ;)
 
Программу писать надо под ТЗ. Остальное - вопросы заказчика, пусть шевелит мозгами =) Я бы так и написал.
 
"В диапозоне от -100..100 посчитать количество и сумму чисел деляшихся одновременно на 3 и 4"
не найти числа и посчитать, а посчитать
о чем речь?
а для того, чтобы посчитать количество и сумму этих чисел в заданном диапазоне - их найти не надо что ли?
 
НЕТ, НЕ НАДО!!!
 
и от этого там сразу второй цикл появился?
все конструкции стандартны переведите на паскаль и будет Вам счастье.
Алгоритм от языка не зависит.

мне лень вспоминать паскаль.

PS: кстати предел цикла нужно вынести в отдельную переменную.
PPS: и округлять строго вниз иначе можно насчитать лишнее.
а, я понял, ну можно и так написать:

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
i,summa,kolvo,step:integer;

begin
summa:=0;
kolvo:=0;
step:=12;
for i:=-100 to 100 do
if ((i mod 3)=0) and ((i mod 4)=0) then
begin
summa:=summa+i;
kolvo:=kolvo+1;
if ((i+step)<=100) then
i:=i+step;
end;
if (kolvo = 0) then writeln('В заданном диапазоне не найдено ни одной цифры, которые делятся одновременно на 3 и 4!')
else writeln('summa: ',summa,' ;kolvo: ',kolvo);
readln;
end.
 
Неэффективно и неправильно. Садись два :D
 
Назад
Зверху Знизу