
Тёма
24.05.2016
17:01:18
оооочень глупая ошибка)

Zart
24.05.2016
17:01:38
а с циклами всё ок
...
for(float change = GetFloat(); change > quarter; change -= quarter) count++;
for(; change >= dime; change -= dime) count++;
for(; change >= nickel; change -= nickel) count++;
for(; change >= penny; change -= penny) count++;
...

Тёма
24.05.2016
17:05:28
спасибо))
ооочень глупая ошибка.

Google

Тёма
24.05.2016
17:05:42

Zart
24.05.2016
17:05:58
обычный цикл for в C
единственный инкремент там в теле цикла

Тёма
24.05.2016
17:06:40
ааа, понял

Zart
24.05.2016
17:07:42
но я бы эту задачку решал бы скорее через count += floor(change / ...); без циклов
@Sharkus тышо, инкремент в условии - это ж сишное всё:
while(*d++ = *s++);

Sharkus
24.05.2016
17:10:30
Да это-то понятно
Просто потом виноватых искать бывает долго :)

Тёма
24.05.2016
17:11:39
блин, всё равно не работает
http://pastebin.com/ksLbWSAJ
:) greedy.c exists
:) greedy.c compiles
:( input of 0.41 yields output of 4
\ expected output, but not "3\n"
:) input of 0.01 yields output of 1
:) input of 0.15 yields output of 2
:) input of 1.6 yields output of 7
:) input of 23 yields output of 92
:( input of 4.2 yields output of 18
\ expected output, but not "22\n"
вообще не понимаю

Google

Zart
24.05.2016
17:12:40
не работает = "не тот результат" или "вешается в бесконечном цикле"?

Тёма
24.05.2016
17:12:46
не тот результат)

Zart
24.05.2016
17:14:00
тогда вероятно набегающие ошибки округления. поменяй count++ на { printf(... change,); count=+ }
чтобы отследить как оно отсчитывает

Тёма
24.05.2016
17:14:33
а еще почему-то когда я в последней строчке пишу for(; change > 0; change -= penny) count++;
вместо change >= penny - всё снова меняется. при том что не должно, учитывая что все числа кратны 0.1

Zart
24.05.2016
17:15:31
пример на втором питоне:
»> 0.3-0.1
0.19999999999999998
в третий завезли коррекционные алгоритмы, так что там не выйдет иллюстрации

Тёма
24.05.2016
17:17:16
а это уже в упор не понимаю
for(; change >= quarter; change -= quarter) count++;
printf("%f\n", change);
for(; change >= dime; change -= dime) count++;
printf("%f\n", change);
for(; change >= nickel; change -= nickel) count++;
printf("%f\n", change);
for(; change >= penny; change -= penny) count++;
printf("%f\n", change);

Zart
24.05.2016
17:17:25

Тёма
24.05.2016
17:17:25
0.160000
0.060000
0.010000
0.010000
3
аааа
понимаб
думаю, и как это решить нормально? можно конечно сделать change >= penny / 2
чтобы было больше ноля но точно меньше penny
но это какой-то вообще костыль

Zart
24.05.2016
17:18:19
я выше упоминал про floor

Тёма
24.05.2016
17:19:08
ааа, понятно
спасибо, дойду до него как-нибудь скоро уже думаю)

Zart
24.05.2016
17:20:45
изза того что дробные числа представлены бинарно в виде сумы отрицательных степеней двойки - не каждое десятичное число можно представить точно. например 0.3
поэтому набегает маленькая разница. когда ты начинаешь делать вот такие инкременты, эта ошибка начинает накапливаться

Google

Zart
24.05.2016
17:22:53
поэтому надо менять алгоритм вообще
к примеру дан change=0.8, если мы поделим его на номинал 0.25 - получим 3.2. т.е. 3 полных четвертака и кусочек
coins = floor(change / quarter); count += coins; change -= coints * quarter;
делим, через floor округляем к меньшему, получаем колво монет этого номинала. плюсуем его к ответу, а из сдачи вычитаем *в один присест* всю сумму этими монетами. там все равно остаются косяки с округлением, но они нивелированы

trump ? trump ? hillary
24.05.2016
17:25:31
говно

Petr
24.05.2016
17:25:57
говно
о, маркдаун-разметка в нике?

trump ? trump ? hillary
24.05.2016
17:26:04
нет

Petr
24.05.2016
17:26:14
а как?
спецсимволы?

Anton
24.05.2016
17:26:29

trump ? trump ? hillary
24.05.2016
17:31:25

Petr
24.05.2016
17:31:36

Тёма
24.05.2016
17:33:14

Zart
24.05.2016
17:34:32

Aragaer
24.05.2016
17:37:27

Тёма
24.05.2016
17:39:20
лол
округления
float four = 4.20;
int fourr = four * 100;
printf("%i\n\n", fourr);
419

Aragaer
24.05.2016
17:44:14
вапще не нужен флоат

Тёма
24.05.2016
17:44:23
я знаю

Google

Aragaer
24.05.2016
17:44:25
надо сразу парсить два инта и присваивать в инт

Тёма
24.05.2016
17:44:25
это я для проверки
аа, в этом смысле
не вариант
ну то есть вариант
но это задачка
и там дана функция уже инпута

Admin
ERROR: S client not available

Тёма
24.05.2016
17:45:11
с обработкой исключений и т д
и типа ее надо использовать

Dmitry
24.05.2016
17:47:37
Ага)

Тёма
24.05.2016
17:55:33
ладно, я хочу уже добить эту задачку
подскажите плиз
как перевести float 4.20 в int 420?
а не в int 419

fox.hs
24.05.2016
17:57:02
from decimal import Decimal
int(Decimal(4.20) * Decimal(100))

trump ? trump ? hillary
24.05.2016
17:57:40

Тёма
24.05.2016
17:58:45

fox.hs
24.05.2016
17:58:51
А
Встрой этот код в С
;D

Google

Тёма
24.05.2016
17:59:22
так то правильным ответом в питоне было бы "перейти на третий питон"
как я понимаю))

fox.hs
24.05.2016
17:59:41
Хм
А в С можно как-то получить дробную часть?

Тёма
24.05.2016
18:01:18
Навернка
Но неужели нельзя это проще сделать??

Aragaer
24.05.2016
18:02:03
прибавить 0.5 после умножения

fox.hs
24.05.2016
18:02:04

Aragaer
24.05.2016
18:02:06
он вниз округляет

Zart
24.05.2016
18:02:17
modf

Aragaer
24.05.2016
18:02:29
4.1999999*100 = 419.99999. При превращении в инт получится 419
надо сделать так - x = 0.5 + 100*f

Тёма
24.05.2016
18:03:23

Zart
24.05.2016
18:03:27
int x = trunc(y * 100 + 0.5)

Aragaer
24.05.2016
18:03:56
ну это стандартно - чтобы округлить до ближайшего целого делаем +0.5 и округляем вниз

Zart
24.05.2016
18:04:25
это то, как сделать round() с помощью floor/trunc

Aragaer
24.05.2016
18:04:57
в С каст флоата к инту это округление в сторону нуля.

Zart
24.05.2016
18:05:09
а вообще надо попробовать int x = round(y * 100);