Loading...
Vincent avatar Vincent 11 Точки

Помощ за две задачи от предишни изпити

Не мога да довърша две задачи от предишни изпити, ако може малко помощ:

1.Първата е от последния изпит. Не мога да загръгля BigIntiger 

Това е кода

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;

public class dasdasa {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int num1 = Integer.parseInt(scanner.nextLine());
        int num2 = Integer.parseInt(scanner.nextLine());

        String [] name = new String[num1];
        int [] visits = new int[num1];
        double [] price = new double[num1];
        BigDecimal [] multiply = new BigDecimal[num1];

        BigDecimal total = new BigDecimal("0.0");

        for (int i = 0; i <num1 ; i++) {
            name[i]=scanner.next();
            visits[i]=Integer.parseInt(scanner.next());
            price[i]=Double.parseDouble(scanner.next());
            multiply[i]=BigDecimal.valueOf(visits[i]*price[i]);
        }

        for (int i = 0; i < num1; i++) {
            total = total.add(multiply[i]);
        }
        for(String start: name){
            System.out.println(start);
        }
        double securityToken = Math.pow(num2,num1);
        System.out.printf("Total Loss: %.20f%n",total);
        System.out.printf("Security Token: %.0f",securityToken);



    }

}

2. Втората е тази https://judge.softuni.bg/Contests/Practice/DownloadResource/1844

Тук на грешките джъдж не ми дава инпът и ми е трудно да разбера къде греша. Това е кода:

import java.math.BigDecimal;
import java.util.Scanner;

public class Testt {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String[] time = scanner.nextLine().split("[:]");

        int steps = Integer.parseInt(scanner.nextLine());
        int second = Integer.parseInt(scanner.nextLine());
        int total =steps*second;

        int hours = (total / 3600)+Integer.parseInt(time[0]);
        int minutes = ((total % 3600) / 60)+Integer.parseInt(time[1]);
        int seconds = (total % 60)+Integer.parseInt(time[2]);

        if(seconds==60){
            minutes++;
            seconds=00;
        }
        if(minutes==60){
            hours++;
            minutes=00;
        }
        if(seconds>60){
            seconds=seconds%60;
            minutes++;
        }
        if(minutes>60){
            hours+=minutes%60;
            hours++;
        }
        if(hours>=24){
            hours=hours-24;
        }

        System.out.printf("Time Arrival: %02d:%02d:%02d", hours, minutes, seconds);



    }
}
Тагове:
0
Programming Fundamentals 12/11/2017 18:21:32
boyan_georgiev avatar boyan_georgiev 62 Точки
Best Answer

1. Проблемите бяха, че не използваш достатъчно големи типове и стойностите превъртат. Ето поправеното решение с коментари за промените, които направих - https://pastebin.com/vg48PbT5

Чисто оптимизационно не е необходимо да пазиш данните от входа в масиви, можеш директо с четенето да ги обработваш. Спестяваш си двата цикъла след това, т.е. печелиш доста време, особено ако имаш много голям вход, както и доста памет, тъй като тези данни се използват точно за едно изчисление и след това вече не са нужни. Ето моето решение от изпита, да стане малко по-ясно какво имам в предвид - https://github.com/Chaosfirebolt/ProgrammingFundamentals-Java/blob/master/src/exam_20171105/AnonymousDownSite.java

 

2. Същият проблем, като предната, интовете превъртат; при часовете със сигурност имаш грешка - може да получиш число по-голямо от 47 и вадейки 24 резултата вече е грешен. Другите неща не съм ги проверявал, но според мен тези if-ове доста ти усложняват дебъгването след това. Ето решение без никакви if-ове, мисля че е доста по-ясно какво се случва, сложил съм коментари навсякъде за пояснение - https://pastebin.com/WH9bZtBT

 

Като цяло чети внимателно constraints и смятай с колко големи числа ще работиш според минималните/максималните стойности, които могат да ти се подадат.

П.С. Този синтаксис с падването на числата не го знаех, и аз научих нещо ново, мерсиsmiley

0
Vincent avatar Vincent 11 Точки

Благодаря ти за отговора!

Ще ги погледна, като гледам има доста "червено".  :)

0
Vincent avatar Vincent 11 Точки

Със закръглянето се справих криво-ляво. Добавих нова променлива 

BigDecimal totalFinal=total.setScale(9, BigDecimal.ROUND_CEILING);

и почна да ми се закръгля.

Но за съжаление джъдж пак не приема 100/100. Това е пълното решение. Пропуснах да кажа, че работя на Java

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;

public class dasdasa {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int num1 = Integer.parseInt(scanner.nextLine());
        int num2 = Integer.parseInt(scanner.nextLine());

        String [] name = new String[num1];
        int [] visits = new int[num1];
        double [] price = new double[num1];
        BigDecimal [] multiply = new BigDecimal[num1];

        BigDecimal total = new BigDecimal("0.0");

        for (int i = 0; i <num1 ; i++) {
            name[i]=scanner.next();
            visits[i]=Integer.parseInt(scanner.next());
            price[i]=Double.parseDouble(scanner.next());
            multiply[i]=BigDecimal.valueOf(visits[i]*price[i]);
        }

        for (int i = 0; i < num1; i++) {
            total = total.add(multiply[i]);
        }
        for(String start: name){
            System.out.println(start);
        }

        BigDecimal totalFinal=total.setScale(9, BigDecimal.ROUND_CEILING);
        double securityToken = Math.pow(num2,num1);
        System.out.printf("Total Loss: %.20f%n",totalFinal);
        System.out.printf("Security Token: %.0f",securityToken);



    }

}
0
Vincent avatar Vincent 11 Точки

Ако може да ударите още едно рамо за проблем свързан с Deciamal Format в Java. 

На тази задача https://judge.softuni.bg/Contests/Practice/DownloadResource/2364

С две думи иска се decimal закръгляне, а аз пиша на Java.

Когато му дам:

DecimalFormat df = new DecimalFormat("#.###");
System.out.println(df.format(total));

Джъдж казва:

Expected           Your

1122430.000   1122430
1070350.512   1070350.512

Когато му дам 

DecimalFormat df = new DecimalFormat("#.000");
System.out.println(df.format(total));

Джъдж казва:

Expected   Your

1100000    1100000.000
1012500    1012500.000

Как да се оправя?

0
boyan_georgiev avatar boyan_georgiev 62 Точки

Съдейки по изходите ми изглежда, че трябва да изчисляваш каква точност след десетичната запетая ти трябва и да построяваш патърна динамично според нужната точност.

0
Vincent avatar Vincent 11 Точки

Ами не ми изглежда динамично. В C# се слага един decimal и джъдж дава 100/100.

В Java не знам защо не се получава. Ето това ми е пълния код

import java.text.DecimalFormat;
import java.util.Scanner;

public class Testt {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

       int count = Integer.parseInt(scanner.nextLine());
       double total = 0;
        for (int i = 0; i <count ; i++) {
            long length = Long.parseLong(scanner.nextLine());
            double width = Double.parseDouble(scanner.nextLine());
            long lengthWing = Long.parseLong(scanner.nextLine());
            total=(length*length)*(width+(2*lengthWing));

            DecimalFormat df = new DecimalFormat("#.###");
            System.out.println(df.format(total));

        }


    }

}
0
17/11/2017 00:29:43
boyan_georgiev avatar boyan_georgiev 62 Точки

В constraints пише - The total years should have the same accuracy as the total width. Т.е. всеки път ще имаш различна точност след десетичната запетая, в зависимост от входа, следователно патърна е динамичен. Ето решение - https://pastebin.com/H6KTutWc. Само че един тест пак ще ти гърми и като прочетеш отново constraints - The total width of the body of the phoenix will have up to 20 digits after the decimal point. Double няма достатъчно точност и ти трябва BigDecimal, а с него няма да има нужда да се занимаваш с патърните - https://pastebin.com/sMu5AD4G.

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