Что нового

Подсчёт всех счастливых билетиков

antidog

Новичок
Сообщения
26
Репутация
2
Хочу сосчитать сколько счастливых билетов общественного транспорта одной Серии существует (для тех кто не знает если сумма первых 3 цифр равна сумме последних 3 цифр , то билет счастливый). Если вам известно сколько их, не говорите пожалуйста, хочу сам сосчитать :D


Код:
$Number1 = 0 ; Последние 3 цифры
$Number2 = 0 ; Первые 3 цифры
$Itog = 0 ; Общее колличество
Do 
	
	
$iNumber1 = $Number1   ; Сумма последних 3 цифр
$iSumma1 = 0
$aNumber1 = StringSplit($iNumber1, '')
If IsArray($aNumber1) Then
    For $i = 1 To $aNumber1[0]
        $iSumma1 += $aNumber1[$i]
    Next
EndIf


$iNumber2 = $Number2 ; Сумма первых 3 цифр
$iSumma2 = 0
$aNumber2 = StringSplit($iNumber2, '')
If IsArray($aNumber2) Then
    For $i = 1 To $aNumber2[0]
        $iSumma2 += $aNumber2[$i]
    Next
EndIf



	If $iSumma1=$iSumma2 Then $Itog = $Itog + 1   ; Если суммы равны прибавляем 1 к итоговому числу
		
	If $Number1 = 999 Then $Number2 = $Number2 + 1 Or $Number1 = 0  ; Если перебор дошёл до номера 000.999 то мнеяем его на 001.000
		
			$Number1 += 1 ; Следущий билетик
			
	
Until $Number1 + $Number2 = 54  ; Когла перебраны все билеты до 999.999 заканчиваем цикл


	If $Number1 + $Number2 = 54  Then  MsgBox (0, "Колличество счастливых билетов", $Itog)   ; И смотрим что поучилось =)





При запуске выдаёт еденицу, жму ок, закрывается
Я только начал изучать AutoIt , так что не ругайтесь если я тут бред написал ;)
p.s. Скрипт суммы числа мне любезно предоставили в одной из тем.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Возможно это работает. Почитай
Код:
;Отсчитываем время
$begin = TimerInit()
;Открываем файл
$file = FileOpen(@ScriptDir & "\test.txt", 2)
;Если не можем - пишем ошибку и выходим
If $file = -1 Then
    MsgBox(0, "Error", "Не можем отрыть файл")
    Exit
EndIf
;Заголовок файла
FileWriteLine($file, "Номер билета" & "|" & "Номер п/п" & "|" & "Сумма")
;Этим будем считать количество счастливых билетов
$iCount = 1
;Цикл для поиска
For $i = 0 To 999999
	;Ставим начальные нули. Как работает не разбирался. Взял из справки
	$s = StringFormat("%06s", $i)
	;Считаем StringLeft($s,3) - левые 3 знака
	;Потом по коду Yashied считаем
	$Left = Execute ("0" & StringRegExpReplace(StringLeft($s,3), "", "+") & "0")
	;Тоже самое для правой части
	$Right = Execute ("0" & StringRegExpReplace(StringRight($s,3), "", "+") & "0")
	;Сравниваем
	If $Left = $Right Then
		;Сохраняем билетик в файл
		FileWriteLine($file, $s & "|" & $iCount & "|" & $Left)
		;Закомментил, но можно в консоль
;~ 		ConsoleWrite($s & " " & $iCount & " " & $Left & @CRLF)
		;Прибавляем счетчик билетов
		$iCount += 1
	EndIf
Next
;Закрываем файл
FileClose($file)
;Выводим сообщение
MsgBox (0,0, "Всего найдено " & $iCount - 1 & " счастливых билетов" & @CRLF & "Затрачено времени " & TimerDiff ($begin) & " мс")


Добавлено:
Сообщение автоматически объединено:

Теперь по твоему коду
Код:
If $Number1 = 999 Then $Number2 = $Number2 + 1 Or $Number1 = 0  ; Если перебор дошёл до номера 000.999 то мнеяем его на 001.000

Это я не могу понять, но работать это не успевает...
Из-за этого
Код:
Until $Number1 + $Number2 = 54  ; Когла перебраны все билеты до 999.999 заканчиваем цикл

Код выполняется 55 раз. То есть от 000000 до 000054, вроде. А на этом интервале билетов только 000000 является счастливым

ps. но это не подсчет, а перебор
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
:blink: я себе это намного проще представлял. Спасибо :smile: . Теперь не понятно по поводу этой строчки
Код:
$s = StringFormat("%06s", $i)

что за %06s ?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
по этому поводу написано в комментариях перед этой строчкой.
но могу еще раз написать
Код:
;Ставим начальные нули. Как работает не разбирался. Взял из справки

задумывалось, что
если $i = 0, то $s = "000000",
если $i = 99, то $s = "000099", ну и так далее

Что может быть проще, чем тупо перебрать билеты от 000000 до 999999, и в каждом посчитать левую и правую части?
А вот твой подход к решению я вообще не понял
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
теперь понял :smile:
А вот твой подход к решению я вообще не понял
;D да я просто хотел одними переменными и арифметическими сделать, т.к. другое пока не умею
 

SyDr

Сидра
Сообщения
651
Репутация
158
axlwor, что это за страшный код такой?
Неужели так надо работать с числами, как со строками?
Код:
$result = 0

For $left = 0 To 999
	For $right = 0 To 999
		If Mod($left, 10) + Mod(Floor($left/10), 10) + Mod(Floor($left/100), 10) = Mod($right, 10) + Mod(Floor($right/10), 10) + Mod(Floor($right/100), 10) Then $result += 1
	Next
Next

MsgBox(262144, Default, $result)
 

axlwor

Скриптер
Сообщения
657
Репутация
147
код страшный, потому что тупо пересчитывает все подряд. Математики бы тоже перевернулись в могилах от всех этих способов :laugh:
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
о, вот этот побыстрее сосчитал :D. просто, быстро и красиво)
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Вот ещё на всякий случай:
Код:
For $l1 = 0 to 9
	For $l2 = 0 to 9
		For $l3 = 0 to 9
			For $r1 = 0 to 9
				For $r2 = 0 to 9
					For $r3 = 0 to 9
						If $l1 + $l2 + $l3 = $r1 + $r2 + $r3 Then $count += 1
					Next
				Next
			Next
		Next
	Next
Next
MsgBox(0,"","Всего: " & $count)
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
тоже вариант, тока ошибку выкидывает, тк не хватает
Код:
$count = 0

kzru_hunter , jumper ?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
antidog, kzru_hunter в ПМ пож-та ;)
 
Верх