Loading...
borkins avatar borkins 47 Точки

Най-вероятно трябва да използваш по-големи променливи.
Когато не са указани допустими стойности на входа при изпитните задачи е много верятно да има няколко входа с много големи числа, които лесно могат да прехвърлят обема на типове като int и float (32 bits). За по-сигурно винаги ползвай по-големи типове като long и double (64 bits).
Логически решението е добре, но има два основни проблема. От една страна не е хубаво да се пишат на един ред толкова много операции, защото това затруднява четимостта, а от друга страна ненужно се повтарят едни и същи изчисления.
Ето един алгоритъм, при който се използва една малка зависимост в стойността на монетите -
2лв, 1лв -> 20ст, 10ст -> 2ст., 1ст. и 50ст., 5ст.
https://pastebin.com/HwFsjw2e
Разбира се, на изпит е по-трудно да се сетиш за подобен алгоритъм, освен ако имаш достатъчно време.

Има и друг по-лесен начин на решение на задачата с помоща на метод:
https://pastebin.com/ZGVvGde4

0
Rogneda avatar Rogneda 60 Точки

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

Използването на по-големи променливи (long и double) даде същия резултат 90/100. 

0
borkins avatar borkins 47 Точки

Проблема е тук (при входове: 2.01, 3.01...):

long coins = (long) ((change - leva) * 100);

Получава се следното:
1. 2.01 - 2 = 0.009999999999999787    (вместо 0.01)
2. 0.009999999999999787 * 100 = 0.9999999999999787 
3. (long) 0.9999999999999787 = 0
4. coins = 0
Т.е. губи се една монета (в случая - 1 стотинка).

Ето един метод за решение на проблема с DecimalFormat за конверсия към C# double (може да го ползваш и за други подобни задачи:
 

// Formatting Java Double to C# Double
public static String getCSharpDouble(double number) {
	StringBuilder sb = new StringBuilder();
	String str = "" + number;
    char sp = new java.text.DecimalFormatSymbols().getDecimalSeparator();
	int len = (str.length() > 15) ? 15 : str.length();
	
	for (int i = 0; i < len; i++) {
		sb.append((str.charAt(i) != sp) ? '#' : sp);
	}
    
	return new java.text.DecimalFormat("" + sb).format(number);
}

 

0
08/02/2018 20:57:08
Rogneda avatar Rogneda 60 Точки

Доколкото разбирам тези задачи са написани за С#, за да се решат със Java трябва да се използва DecimalFormat. С DecimalFormat и моето решение минава със 100/100 - само че не е най-удачното решение :). 

Ще си позволя да цитирам отговора който получих от Цветомир Марков относно задачата:

Честно казано не успях да проследя грешката във вашето решение, но когато аз пробвах да я реша на Java също се натъкнах на подобен проблем с 90/100 точки и се оказа, че тестовете на задачата са изключително неблагосклонни към решенията на Java заради аномалиите в числовите типовете данни с  плаваща запетая. В C# например решението е много по-лесно, защото има тип decimal,  който е с по-висока точност от double. В java няма такъв тип и се налага да се правят различни трикове, защото понякога аномалиите са трудно забележими, но объркват нещата.. Например при сравнение на 1.88 с 1.88 се оказва, че понякога са различни, защото едното от числата всъщност е 1.8800000000001. Относно вашето решение, съветът ми е да се стараете да пишете по-опростени и инуитивни решения, защото грешките се откриват по-лесно и поправката им отнема много по-малко време. Ще приложа моето решение на java, разгледайте го има коментари към него и може да го дебъгнете, за да разберете как работи. https://pastebin.com/cKGqB1vh

0
bobby_k avatar bobby_k 7 Точки

Здравейте,

Моят проблем е аналогичен -jugde дава 90/100 т. на решение на Java.Конструирането на решението ми е с по-различна логика. Използвах съветите за използване на decimal format, и мисля че тестовете за 1.88, 3.01, 2.01 минават, но все пак не намирам грешката. Благодаря предварително.

Моето решение https://pastebin.com/VkM6RUxz

0
Rogneda avatar Rogneda 60 Точки

С твоето решение и decimal format не е нужно да използваш, грешката ти е на ред 40.. вместо >10 .. сложи >=10.

0
bobby_k avatar bobby_k 7 Точки

Благодаря

0
simona_st avatar simona_st 38 Точки

Дали някой може да даде съвет за този проблем на C++. Какво да ползваме вместо int и double, така че и Visual Studio, и judge да го приемат ?

0
Rogneda avatar Rogneda 60 Точки

Опитай с decimal

0
kolioi avatar kolioi 641 Точки

@Rogneda

В C/C++ няма decimal.

@simona_st

Ето ти едно решение на C++ с масив (не знам дали сте учили)   https://pastebin.com/nTEKJrAj

и без масив   https://pastebin.com/LgjiJh3z

Проблема тук е в закръгляването, както е посочил borkins

Ако заменя този ред

amount = money * 100 - amount * 100;

с това

amount = (money - amount) * 100;

и гърмят два теста - седми и осми.

Така че проблема с тази задача не е в езика за програмиране (C++,C#,Java).

1
simona_st avatar simona_st 38 Точки

Супер, благодаря!

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