Задача Calculate Discount

Здравейте!
Имам проблем с един от тестовете (4) на задача https://judge.telerikacademy.com/problem/00304discount и не знам къде е проблема.
Резултатът от теста, който не минава е:
Your output (clipped)
6.30
4.73
Кодът е наличен тук:
https://pastebin.com/NpgHHVF9

Благодаря предварително :slight_smile:
Диди

1 Like

@diana_gospodinowa Диди, задачата предполага решение без да знаеш масиви :wink:
Т.е. може да се реши без масив.
Това което забелязвам е, че в масив от Double : " Double discounted_price[] = new Double[n];" му подаваш “Integer n = Integer.parseInt(user_input.nextLine());”, което вероятно ти създава предпоставка за грешка в калкулацията :wink:
При математически изчисления: “discounted_price[i] = item_price - item_price * 0.65;” също е добре да се използват скоби " ( & ) " показващи реда на извършване на действията.
В случай, че имаш затруднения с решаване на задачата - пиши да помагам. Нарочно не пействам готов код :slight_smile: Поздрави и happy coding :slight_smile:

Здравей!
Ще подскажеш ли къде греша? И при мен е на същия тест грешката :frowning:

https://pastebin.com/0fwiPGgm

@voxa доста неща са:

  1. коригирай си начина на вход от конзолата: " int items = Integer.parseInt(sc.nextLine());" & “double price = Double.parseDouble(sc.nextLine());”.
    Няма нужда от парсване.
  2. имаш грешка в условието на цикъла: “for (int i=1; i<=items; i++)”
  3. има проблем с формата на принтиране: “System.out.printf(”\n%.2f",disPrice)"

Отново споделям, че не пействам готов код, но ако много забиеш и не намираш решение, ще ти споделя и решението с корекции

Привет , отново !
Оправих парсването .
Относно другите грешки, сигурно съм забила, както се изрази. :slight_smile:
“for (int i=1; i<=items; i++)” и “for (int i=0; i< items; i++)” е едно и също ,нали?

“for (int i=1; i<=items; i++)” и “for (int i=0; i< items; i++)” е едно и също ,нали?

Различават се крайната и началната точка :slight_smile:

Коригирай формата и ще имаш 100 т.
Аз използвах DecimalFormat

От 5тият път стана … Благодаря !

Проблемът се реши с DecimalFormat и не е свързан с използане на n или масиви.
До момента това е първата задача, която има проблем със стандартно форматиране на double.

1 Like

Явно проблемът с теста, който се счита за грешен е следния:

При използване на DecimalFormat
Input:
2
18
13.5

Output:
6.30
4.72

В случай, че се използва друг формат, като double има разминаване в резултатите, т.е.

Output:
6.30
4.73

По прости сметки, както сме учили в училище…
13.50 * 0.35 = 4.725
Което при стандартно закръгляне си е 4.73.

За мен теста не е коректен и в случай, че се изисква специално форматиране на резултата е редно да се зададе, като пример или зависимост.

И все пак, ако на някой му интересно решение с цикъл и масив може да го открие тук: https://pastebin.com/TFJKDv21

4 Likes

Благодаря ти diana_gospodinowa, и аз изпаднах във същия проблем, благодаря ти и за твоето интересно решение на проблема :wink:

1 Like

Радвам се, че съм помогнала било то и неволно :slight_smile:

Успех :slight_smile:

Тестът е оправен. Извиняваме се за причиненото неудобство : )

1 Like

Пререшавам си циклите и имам същия проблем на JS, макар че първото решение е минало на 100%.

Как може да се закръгли 4.725 до 4.73? Само този тест не минава с .toFixed(2), тъй като връща стринг 4.72.

Math.floor/ceil/round връщат съответно целите числа.

3 Likes

Здравейте.
Само аз ли не намирам тази задача в judge ?
Поздрави.

@skurtov162 би трябвало да я виждате. Задачата е част от състезание и трябва да сте в него, за да имате достъп до нея.

@pavel.shishmanov правилният метод, който ви трябва е https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round

Имам същия проблем с .toFixed(2)? Пробвах с .toPrecision(3) и какво ли още не. Не можах да намеря решение как да закръгля 4.725 до 4.73 и 9.334 до 9.33 например. Помощ?

Здравей, аз се справих с този проблем, като комбинирах няколко метода.

const number = 4.725;
const intPart = Math.trunc(number);
let afterPoint = number % 1;
afterPoint = afterPoint * 100;
afterPoint = afterPoint.toFixed(2);
afterPoint = Math.round(afterPoint);
print(intPart + '.' + afterPoint);

После с още малко врътки се решава задачата :slight_smile:.
Със сигурност има и по-добри начини от този, но аз така го направих.

2 Likes

А дали това е идеята на задачата? Да минем през няколко метода и т.н. или просто въпросния тест е сгрешен?

Здравей :slight_smile:
Тестът е абсолютно верен. Закръгляне на числа се учи може би в 5-ти клас и си има правила.
Друг е върпосът каква би била имплеметацията с различни програмни езици, но техните методи/функции не следва да определят и/или променят математически правила :wink:

Успех,
Диди

Относно математиката и как се закръглят числата е от явно по-явно…въпроса ми беше повече дали задачата е с верни аутпут резултати. Видях в горните постове, че е била с аутпут 4.72 и е бил сменен на 4.73 от там идва и проблема при решаването й на JavaScript с цикли каквато и е темата на задачите. Ще я мъчим :slight_smile: