LINUX.ORG.RU
ФорумTalks

Задача про нахождение суммы ряда чисел _без_ циклов

 , ,


0

1

Здравствуйте, дорогие любители математики и программирования!

Начинаем нашу будничную ЛОРовскую викторину на программирование и математику. Собственно, она больше на математику чем на программирование (поэтому и ответы, внезапно, могут быть разными).

Итакъ, поехали. Задача: написать программу, которая принимает на вход целые числа A и B и выводит сумму ряда целых чисел от A до B включительно. При этом перебирать числа в цикле _нельзя_. Никаких for, while, until, repeat,... и т.д.

Пример работы готовой программы:

> ./sumatob 24 40007
800299752
> ./sumatob 369 1001
433605
> ./sumatob -5000 100001
4987647501
>
Пользоваться Гуглом при решении задачи не запрещается.

Моё решение этой задачи здесь: https://saahriktu.org/downloads/sumatob.tar.xz

★★★★★

Сумма арифметической прогрессии
Алгебра: учебник для 9 класса общеобразовательных учреждений

Ты форумом не ошибся? К ЕГЭ в 9-ом классе на других форумах готовятся.

gremlin_the_red ★★★★★
()

При этом перебирать числа в цикле нельзя

Так. А написать кодогенератор или плагин к LLVM генерирующий программу перебирающую цифры без цикла - можно ?

DawnCaster ★★
()
Ответ на: комментарий от gremlin_the_red

Или суть задачи — найти, как в твоём языке программирования называется библиотека для работы с числами произвольной длины? Тогда это не девятый класс, а первый курс нижнемухосранского ПТУ.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от saahriktu

А вдруг кто-нибудь другой метод решения найдёт.

Другой мэтод: «сэм-восэм… где-то так…» ©.

quickquest ★★★★★
()
Ответ на: комментарий от anto215

но у него там поскакаль. который даже в целочисленное деление не могет, судя по всему (или автор не знает как пользоваться целочисленным делением)

n_play
()
Ответ на: комментарий от saahriktu

Деды методом Гаусса считали, и мы так считали, и дети наши будут так считать.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

Элементарно, Ватсон ;)

      sumatob ← {+/(⍺-1)+⍳⍵-⍺-1}
      24 sumatob 40007
800299752
      369 sumatob 1001
433605
      ¯5000 sumatob 100001
4987647501

PS: учите APL

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Откуда ж я знаю, почему ты не знаешь? Плохо учил, или прогрессирующий склероз. Но то, что не знаешь — это факт. Иначе использовал бы div вместо плавающей арифметики.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

смутно припоминаю, что оператор целочисленного деления в этом вашем паскале назывался 'div', вместо '/'. Ещё один забытый аргумент в ненужность паскаля

Harald ★★★★★
()
Ответ на: комментарий от Harald

Везде есть свои особенности. В том же C/C++, например, местами приходится писать именно «1.0» вместо «1».

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от gremlin_the_red

Как будто бы от этого что-то принципиально меняется. Хотя код сократить, конечно, можно.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

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

да и вообще не влезть обратно в целочисленное, т.к. у плавучки диапазон больше, чем в 64бит целом.

64бит - 20 знаков, а у плавучки меньше, значит тебе отрежет до 16 знаков (или сколько там в дефолтном паскакалевском).

и вот у тебя на выходе после округления 1232321315453000, а должно быть 1232321315453256 например.

n_play
()

да элементарно задача на метки

Shulman
()

В архиве:

(* program that sums integer values from A to B without loops
   2020 (c) saahriktu
   Under GNU GPLv3 *)
program sumatob;
uses sysutils;
var
   a, b, s : Int64;
begin
   if ParamCount < 2 then begin
      writeln('usage: sumatob A B');
      exit;
   end;
   if TryStrToInt64(ParamStr(1), a) = False then begin
      writeln('Error: invalid number A');
      exit;
   end;
   if TryStrToInt64(ParamStr(2), b) = False then begin
      writeln('Error: invalid number B');
      exit;
   end;
   if b < a then begin
      s := a;
      a := b;
      b := s;
   end;
   s := trunc((b - a + 1) * (a + b) / 2);
   writeln(s);
end.

Нда.

Shaman007 ★★★★★
()
Последнее исправление: Shaman007 (всего исправлений: 1)
Ответ на: комментарий от Shaman007

Да, но за = False Вирт избил бы его грязной шваброй. Не для этого он в язык boolean вводил. И никто бы за это его не осудил.

gremlin_the_red ★★★★★
()
Последнее исправление: gremlin_the_red (всего исправлений: 2)
Ответ на: комментарий от Shaman007

Саахрикту молодец! Теперь осталось оформить отчёт по шаблону, и можно сдавать!

титульный лист:

        Линукс Орг Ру

Вычисление суммы арифметической 
        прогрессии

                  Выполнил студент: saahriktu
                  Проверил: коллектив раздела Talks


     Старый Оскол 2020
содержание
Введение.
Теоретическая справка.
Результаты работы программы.
Текст программы.
Руководство пользователя.
Заключение.

Harald ★★★★★
()
Ответ на: комментарий от Harald

О, у меня до сих пор хранится рамка со штампом в ODF. Не даром я ее 15 лет храню.

Shaman007 ★★★★★
()
Ответ на: комментарий от Shaman007

В Паскале всегда приходится проверять ввод, что я всегда и делал.

Почему это менее актуально в Си? Потому, что glibc умный.

Та же функция atoi(), например, если ей скормить дробное число, то она просто округлит его до целых. И программа спокойно продолжит свою работу как если бы юзер ввёл целое число. Если же ей скормить, например, строку, то она просто вернёт 0. И программа спокойно продолжит свою работу как если бы юзер ввёл 0.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Shaman007

Я пишу разные программы. А программа программе рознь. Если для работы программы критичны какие-то значения, то в ней у меня всегда стояли и стоят проверки.

А так если юзер вводит не то, что нужно, и получает не то, что нужно - он сам виноват. Сколько проверок ни вводи от этого результат правильным не станет. Максимум что можно - аварийно завершить работу. Но от этого никому лучше не станет.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Так. Для того, чтобы писать if func(x) then и a:=b<c;, а совсем не для того, чтобы писать if func(x) = true then и if b<c then a:=true else a:=false Читай уже учебник.

gremlin_the_red ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.