Scholarship - Conditional Statements - Java
Здравейте,
Judge ми дава 93/100, не мога да си открия грешката, ако може малко помощ.Благодаря предварително.
import java.util.Scanner;
public class scholarship {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double income = Double.parseDouble(scan.nextLine());
double grade = Double.parseDouble(scan.nextLine());
double minSalary = Double.parseDouble(scan.nextLine());
double scholarshipSocial = minSalary * 0.35;
boolean isItUnderTwo = income > minSalary || (grade > 2 && grade <= 4.50);
boolean topScore = grade >= 5.50;
boolean isItSocial = (income < minSalary || grade > 4.50);
if (topScore){
double scholarship = grade*25;
if (scholarship >= scholarshipSocial){
System.out.printf("You get a scholarship for excellent results %.0f BGN",Math.floor(scholarship));
}else {
System.out.printf("You get a Social scholarship %.0f BGN",Math.floor(scholarshipSocial));
}
} else if (isItUnderTwo){
System.out.println("You cannot get a scholarship!");
}else if (isItSocial){
System.out.printf ("You get a Social scholarship %.0f BGN",Math.floor(scholarshipSocial));
}
}
}
Ох много благодаря, но пак не мина 93/100. Ето с корекция :
Не разбирам :(, грешката ми е на тест 14 от judge, какво ли му пуска като проверка, за да гърми.
P.S.: Иначе имах подобен случай с Math.ceil и floor при задачата sleepyCatTom, там не можах да схвана/ да се досетя и съвсем откровено налучках Math.ceil - a до като се чудех какво го мъчи ...
Ако искаш, ще ти дам линк към задачата, но е на С#.
Ето меоето решение на задачата:
За Math.Ceil и Math.Floor може да те подведа с отговора си. Аз изграждам логиката си на база проблема в задачата, като ползвам Math.Ceil в изчисленията за да компенсирам загубите при закръгляне в реалните числа до цяло число. При извеждане на резултат, ако в условието не е посочено друго, ползвам Math.Floor за да илиминирам добавените закръглени стойности в изчислението. Математиката е точна наука, но в програмирането поради двоичното преобразуване в десетична бройна система с която сме свикнали да смятаме има разлики в стойностите. В C# и Java не съм тествал, но в С++ например:
Заради подобни стойности, дава грешка в изчисленията и Judge връща грешен отговор.
Естествено това си е мое обяснение на срещнатите проблеми до тук и неискам да те обърквам. Когато Judge ми върне грешка и се съмнявам в някои изчисления, проверявам кода и там където имам пресмятане с double и int ползвам Math.Ceil, а там където са double и double ползвам Math.Floor. Обикновено се получава, но ако не стане, търся друго решение. :)
Ами добре да, благодаря ти, принципа нали трябва да е индентичен, само езика различен.
Нещо друго интересно обаче, което не разбирам, защо е така, ако мога да питам.Благодаря, че ми отговаряш... хаха
Тези двете задачи,единствения начин, по който ми премиха в judge беше, като закръгля операциите с Math.ceil, а резултата с floor:
Harvest
import java.util.Scanner; public class Harvest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int vineyard = Integer.parseInt(scan.nextLine()); double grapesPerMeter = Double.parseDouble(scan.nextLine()); int litersNeeded = Integer.parseInt(scan.nextLine()); int workers = Integer.parseInt(scan.nextLine()); double grapesTotal = vineyard*grapesPerMeter; double wineTotal = (grapesTotal*0.40); double litersTotal = (wineTotal/2.5); if (litersTotal>=litersNeeded){ double liters = Math.ceil(litersTotal-litersNeeded); double perPerson = Math.ceil(liters/workers); System.out.printf("Good harvest this year! Total wine: %.0f liters.%n" + "%.0f liters left -> %.0f liters per person.",Math.floor(litersTotal),Math.floor(liters),perPerson); }else { double less = Math.floor(litersNeeded-litersTotal); System.out.printf("It will be a tough winter!" + " More %.0f liters wine needed.",Math.floor(less)); } } }sleepyCatTom
import java.util.Scanner; public class sleepyTomCat { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int freeDays = Integer.parseInt(scan.nextLine()); double freeDaysPlay = freeDays * 127; double workDays = (365-freeDays)*63; double sleepNeeded = 30000; double totalPlay=freeDaysPlay+workDays; double sleepMinutes = sleepNeeded-totalPlay; if (sleepNeeded >= totalPlay){ double hours = sleepMinutes/60; double minutes = sleepMinutes%60; System.out.printf("Tom sleeps well%n%.0f hours and %.0f minutes less for play",Math.floor(hours),minutes); }else { double hours = Math.ceil(sleepMinutes / 60); double minutes = Math.abs(sleepMinutes % 60); System.out.printf("Tom will run away%n%.0f hours and %.0f minutes more for play", Math.abs(hours), minutes); } } }Знам си, че кода ми е дървен , но се притеснявам, че в логиката ми бяга нещо. Знаеш ли защо трябва да закръгля операциите със ceil ? Или като цяло нещо не съм разбрала? Сигурно ми е глупаво питането, ама все пак