Loading...
VasilK avatar VasilK 40 Точки

Clever Lily - друга логика

import java.util.Scanner;

public class Clever_Lily {
    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        int age = Integer.parseInt( scanner.nextLine() );
        double wash = Double.parseDouble( scanner.nextLine() );
        int price = Integer.parseInt( scanner.nextLine() );

        int toys = 0;
        int cash = 0;
        int even = 0;


        for (int i = 1; i <= age; i++) {

            if ( i % 2 == 0) {
                cash += 5 * i;
                even++;
            } else {
                toys++;
            }

        }

        int c = cash + (toys * price) - even;

        if (c >= wash) System.out.printf( "Yes! %.2f", (double) (c - wash) );
        else System.out.printf( "No! %.2f", (double) (wash - c) );


    }
}
 

Тагове:
0
Programming Basics with Java
RoYaL avatar RoYaL Trainer 6849 Точки
Best Answer

Не знам как е решена на лекции, но задачата като цяло има и решение без цикли, до колкото мога да си го представя. Въпрек, че е добре да се упражняват цикли, де, че са си най-трудната материя в basics :)

Идеята е следната, щом търсим колко четни числа има в годините, то винаги са половината. На 10 години има 5 четни числа, на 12 години има 6 четни числа. Все е age / 2. Ако годините са нечетни, числата ще паднат с едно при цялочислено деление, така че няма проблем. При 9 години има 4 четни числа. 9 / 2 = 4. Нечетните, т.е. играчките, винаги са остатъка. При 9 години имаме 4 чтни числа, съответно имаме 5 играчки (9 - 4 = 5)

Кешът е сумата на всички четни числа * 5.

Как да намерим сумата на всички четни числа?

Ами нека направим едно замерване:

Сумата на четните числа до 10 e 30:     10 + 8 + 6 + 4 + 2 = 30

На четните числа до 12 е 42:                  12 + 10 + 8 + 6 + 4 + 2 = 42

На четните числа до 14 е 56:                  14 + 12 + 10 + 8 + 6 + 4 + 2 = 56

На четните числа до 16 е 72:                  16 + 14 + 12 + 10 + 8 + 6 + 4 + 2 = 72

Да видим можем ли да намерим зависимост:

При вървия случай 30 / 10 = 3.00

При втория случай 42 / 12 = 3.50

При третия случай 56 / 14 = 4.00

При четвъртия случай 72 / 16 = 4.50

Т.е. за всяко четно числа скачат с 0.50. Сумата на четните числа за първото четно (2) е 2. 2/2 = 1, за втоторо (4) е 6/4 = 1.5. Т.е. почваме за първото четно от 1.00 до сътветното друго четно, колкото четни има до него, толкова пъти прибавяме 0.5.

Ами, в 14 е 7 пъти по 2, т.е. 7 пъти прибавяме 0.5 = 3.5 + 1 пъти заради двойката = 3.5 + 0.5 = 4.00 (което е вярно в по-горния прмер). За 16 е 8 пъти + 1 път = 8*0.5 = 4 + 0.5 = 4.5 - отново вярно.

Т.е. от това можем да изведем формула, че сумата на четните числа е: ((максиалното_четно / 2) * 0.5) + 0.5

Тъй като имаме два пъти един след друг деление на 2 (едното е / 2 другото *0.5), просто трябва да разделим на 4, за да опростим формулата: максималното_четно / 4 + 0.5.

Например 20 / 4 + 0.5 = 5 + 0.5 = 5.5

Сборът им е 20 * 5.5 = 110.

Така ли е? 20 + 18 + 16 + 14 + 12 + 10 + 8 + 6 + 4 + 2 = 110.

Значи cash-ът при age = 2 е: ((maxEven / 4.00) + 0.5) * 5 = 550 лв.

 

Окей, но как знаем кое е максималното четно число? Ами: ако годините са четни (age = 10 примерно), то годините са максималното четно число. Ако не са четни - е годините минус едно (age - 1)

Т.е. при:

age=21
wash=1570.98
price=3

Имаме:
 

int even = age / 2 = 21 / 2 = 10;

int maxEven = age - 1 = 21 - 1 = 20;

int cash = (((maxEven / 4.00) + 0.5) * maxEven) * 5 = (((20 / 4.00) + 0.5) * 20) * 5 = (5.00 + 0.5) * 20) * 5 = 5.5 * 20 * 5 = 110 * 5 = 550

int toys = age - even = 21 - 10 = 11

int c = cash + (toys * price) - even = 550 + (11 * 3) - 10 = 550 + 33 - 10 = 550 + 23 = 573

           else System.out.printf( "No! %.2f", (double) (wash - c) );

                         No (1570.98 - 573) = "No 997.98"

което е като в условието

Ето го в код: https://pastebin.com/Cr0QnMxU

 

Давам го като идея, ако не е давано, защото винаги е от полза да могат да се намират такива зависимости :)

 

Успех

 

0
20/10/2018 16:57:22
VasilK avatar VasilK 40 Точки

Royal mерси за отговора. Много изчерпателно. 

0
likedamage avatar likedamage 3 Точки

Не успявам да ти разбера въпроса и може ли условието :)

0
VasilK avatar VasilK 40 Точки

Няма въпрос. Просто споделям различно решение от даденото в курса.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.