@ru_python

Страница 796 из 9768
Тёма
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
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);

Тёма
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
Zart
24.05.2016
17:34:32
Aragaer
24.05.2016
17:37:27
понятно, спасибо) я решил всё просто в int перевести умножив на 100
Если это деньги, то надо просто сразу все считать в минимальных единицах - копейках, центах и т.п.

Тёма
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);

Страница 796 из 9768