Что нового

Все Сумма Гаусса

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Задача построить 2 функции:
1) Подсчитать сумму чисел от одного заданного числа, до другого заданного (целые числа).
2) Подсчитать сумму цифр чисел от 1 до целого числа (100, 1000, и т.д.), слаживая сумму прибавляемого числа.
Подробнее рассказано в этом ролике.

Пример чисел для первой функции:
от 1 до 100 должно получиться 5050 (1 + 2 + 3 + ... + 10 + 11 + 12 + ... + 98 + 99 + 100).

Пример чисел для второй функции:
от 1 до 100 должно получиться 901 (1 + 2 + 3 + ... + 1+0 + 1+1 + 1+2 + ... + 9+8 + 9+9 + 1+0+0).

Условия задачи:
1) Нельзя использовать пользовательские (UDF) функции
2) Нельзя использовать циклы
3) Каждая функция должна содержать всего одну строку (в принципе это условие уже отменяет второе :smile:)
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
2) Нельзя использовать циклы
Очень интересно как, без ЦИКЛА, узнать какие числа лежат между двумя заданными числами, и перечислить их, неужели я на столько туп?
Сообщение автоматически объединено:

первая будет подсчитывать сумму чисел от одного заданного числа, до второго (целые числа)
Код:
$iMin = 1
$iMax = 100
$iResult = ($iMax + $iMin) * Floor($iMax / 2)
ConsoleWrite($iResult&@CRLF)
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
$iMin = 1 $iMax = 100 $iResult = ($iMax + $iMin) * Floor($iMax / 2) ConsoleWrite($iResult&@CRLF)
Хороше.
1-100 работает
3-100 работает
3-200 работает и т.д.
но
2-100 уже не работает
4-100 тоже нет.
все таки я тупой, пойду спать, надоело голову ломать.
Сообщение автоматически объединено:

Хороше.
1-100 работает
3-100 работает
3-200 работает и т.д.
но
2-100 уже не работает
4-100 тоже нет.
все таки я тупой, пойду спать, надоело голову ломать.
не фига, один есть
Код:
$iMin = 2
$iMax = 100
$iResult = (($iMax + $iMin) * ((($iMax - $iMin)+1) / 2))
ConsoleWrite($iResult&@CRLF)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
По первой функции
Код:
MsgBox(0,'',_Add(1,100))

Func _Add($min, $max)
    return(($max^2-$min^2+$max+$min)/2)
EndFunc

По поводу второй в одну функцию и без цикла - сложнее )))
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Внёс немного коррекции в задачу (касательно второй функции)...
Задача построить 2 функции:
1) Подсчитать сумму чисел от одного заданного числа, до другого заданного (целые числа).
2) Подсчитать сумму цифр чисел от 1 до целого числа (100, 1000, и т.д.), слаживая сумму прибавляемого числа.

Мой вариант решения сначала не проверял на других числах, только на 1 до 100/1000/1000000, поэтому не сразу заметил сверх сложность поставленной задачи в первоначальном виде, хотя было бы интересно решить и её.
Метод Гаусса не предусматривает сложение суммы цифр чисел если это не целые (круглые) числа.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Вторую задачу можно используя две функции ( но по одной строке), особо не проверял:
Код:
MsgBox(0, '', _AllSum(1, 100))

Func _AllSum($min, $max)
    Return (_Sum($min - 1, 0) + _Sum($max - 1, 0)) * $max / 2 + _Sum($max, 0)
EndFunc   ;==>_AllSum

Func _Sum($x, $Sum)
    Return StringLen($x) > 1 ? $Sum + Mod($x, 10) + _Sum(Int($x / 10), $Sum) : $Sum + $x
EndFunc   ;==>_Sum

Кстати , решение первой задачи рекурсией - должно работать при любых сочетаниях, но лимитирована глубиной рекурсии )))
Код:
MsgBox(0, '', _RecSum(1, 100))

Func _RecSum($min, $max)
    Return $min=$max ?  $max : $min+_RecSum($min+1,$max)
EndFunc


2-100 уже не работает
Для решения методом Гауса нужно ещё проверять диапазон вычисления и считать чуть по разному с чётным и нечётным количеством элементов диапазона.
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вторую задачу можно используя две функции
Это уже нарушает условия задачи (" Нельзя использовать пользовательские (UDF) функции ").

решение первой задачи рекурсией
Тоже как бы нарушение, рекурсия это тоже своего рода цикличность, но даже если закрыть на это глаза, то ограничение AutoIt'а не даёт решить задачу.

Дам подсказку: решение кроется в использовании строковых функции.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Если для чисел от 1 и до 100/1000/10000/100000...... , то не сложно )
Код:
$Max=100
MsgBox(0,'',(StringLen($Max)-1)*9*$max/2+1)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Если для чисел от 1 и до 100/1000/10000/100000...... , то не сложно )
Мда... хорошее решение, у меня получилось немного иначе:

Код:
$iStart = 1
$iEnd = 1000000

ConsoleWrite(_GauseMethod1($iStart, $iEnd) & @CRLF)
ConsoleWrite(_GauseMethod2($iStart, $iEnd) & @CRLF)

Func _GauseMethod1($iStart, $iEnd)
    Return (($iStart + $iEnd) * ((1 + ($iEnd - $iStart)) / 2))
EndFunc

Func _GauseMethod2($iStart, $iEnd)
    Return Execute(StringRegExpReplace($iEnd - 1, '(.)', '+\1')) * ($iEnd / 2) + 1
EndFunc


Странно почему метод Гаусса не работает для других чисел, не круглых...
 
  • Like
Реакции: ra4o

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Метод Гауса (сама идея счёта) я думаю будет работать для любых чисел из первой задачи, только для чётного и не чётного числа цифр в диапазоне будет несколько отличаться, для второй задачи будет работать только для диапазона, где круглое число будет ровно в середине диапазона и опять же с поправками на чётное и не чётное количество чисел в диапазоне.
 

Oki

Продвинутый
Сообщения
452
Репутация
63
1 до целого числа (100, 1000, и т.д.), слаживая сумму прибавляемого числа.
  • На русском языке числа складываются, а не "слаживаются".
  • Сумма не числа, а его цифр.
  • Желание сказать, что последнее число это единица с нулями, осталось невысказанным, а угадывается лишь неявно по одному из дальнейших комментариев, до прочтения которого у меня было желание переспросить, а не это ли случайно имел в виду топикстартер, поскольку задача в общем виде куда сложнее.
  • Обе задачи не на умение воспользоваться особыми функциями языка, а решаются простыми математическими формулами.
Странно почему метод Гаусса не работает для других чисел, не круглых...
Потому что не надо ориентироваться на рассуждения паренька из этого видео, который вовсе не знает, как решается задача. Такое ощущение, что ему кто-то пытался решение рассказать, упустив очень важные элементы аргументации, а он в итоге несёт чушь, приводящую к правильному результату, который он, видимо, знал заранее без понимания, как его аргументировать.

Ключевой особенностью пар чисел в этой задаче является не свойство равенства сумм (которое настолько же тривиально, как первая задачка в этом топике), а отсутствие переносов между разрядами при сложении. Именно благодаря отсутствию переносов между разрядами при сложении, например, слагаемых 318072 и 681927 имеет место свойство (3+1+8+0+7+2)+(6+8+1+9+2+7)=9+9+9+9+9+9. Это свойство актуально для любой пары неотрицательных целых слагаемых, дающих сумму, десятичная запись которых состоит лишь из девяток. Прочие числа обычно можно получить как при сложении двух чисел с переносами между разрядами, так и без. Например, 253=141+112=125+128; сложение первой пары слагаемых (141 и 112) происходит без переносов между разрядами, поэтому 2+5+3=(1+4+1)+(1+1+2), тогда как во второй паре при переносе из разряда единиц в разряд десятков 10 единиц превращаются в один десяток с потерей девяти в сумме цифр, в результате чего 2+5+3=(1+2+5)+(1+2+8)-9. Такие потери всегда кратны 9 для десятичной системы записи.
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Всем привет - увидел - заинтересовало. А кто-нибудь занимался общей функции для любого числа или для диапазона чисел для 2-й задачи? Если что поделитесь..., чтобы мозг не ломать.
Тут нужно было тоже для чисел от 0 до 99 - кое-что сделал, далее пока не смотрел.
Вы хотели в одну строку, конечно это извращение, но работает )))

Код:
$x=99
$iRes=_Gause_0_99($x)
MsgBox(4096,'$iRes',$iRes)

Func _Gause_0_99($x)
  Return StringLen($x)<>2? $x : SetError(Assign('n',StringLeft($x,1),1)+Assign('k',StringRight($x,1),1),0,$n*(45+5*($n-1)+1)+($k^2+3*$k)/2+$k*($n-1))
EndFunc
; $xx=$n*(45+5*($n-1)+1)  ; формула кратных 10, 20, 30, .. , 90
; $xx=$n*(45+5*($n-1)+1)+($k^2+3*$k)/2+$k*($n-1)  ; формула от 10 до 99


Вопрос снимается - решил через цикл по разрядам.
 
Последнее редактирование:
Верх