06. Coins - Exam - 7 January 2018
Здравейте,
Решението ми на задачата Coins от Programming Basics Online Exam - 7 January 2018, получава само 90/100 точки. Всичко ми се струва вярно, но явно не е.
https://pastebin.com/pQq7dC8m
Здравейте,
Решението ми на задачата Coins от Programming Basics Online Exam - 7 January 2018, получава само 90/100 точки. Всичко ми се струва вярно, но явно не е.
https://pastebin.com/pQq7dC8m
import java.util.Scanner;
public class Coins {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double money = Double.parseDouble(scanner.nextLine());
int coin = 0;
money = Math.round(money * 100);
while (money > 0) {
if (money >= 200){
coin++;
money = money -200;
} else if (money >= 100) {
coin++;
money = money -100;
} else if (money >= 50) {
coin++;
money = money -50;
} else if (money >= 20) {
coin++;
money = money -20;
} else if (money >= 10) {
coin++;
money = money -10;
} else if (money >= 5) {
coin++;
money = money -5;
} else if (money >= 2) {
coin++;
money = money -2;
} else if (money >= 1) {
coin++;
money = money -1;
}
}
System.out.println(coin);
}
}
едно решение на JAVA
Аз съм го решил по подобен начин, но ми дава само 80 точки, не разбирам къде ми е грешката, ако може някой да помогне!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _05.Coins
{
class Program
{
static void Main(string[] args)
{
double sum = double.Parse(Console.ReadLine());
int coins = 0;
while (sum > 0)
{
sum = Math.Round(sum, 2);
if (sum >= 1000)
{
sum -= 1000;
coins++;
}
else if (sum >= 500)
{
sum -= 500;
coins++;
}
else if (sum >= 200)
{
sum -= 200;
coins++;
}
else if (sum >= 100)
{
sum -= 100;
coins++;
}
else if (sum >= 50)
{
sum -= 50;
coins++;
}
else if (sum >= 20)
{
sum -= 20;
coins++;
}
else if (sum >= 10)
{
sum -= 10;
coins++;
}
else if (sum >= 5)
{
sum -= 5;
coins++;
}
else if (sum >= 2)
{
sum -= 2;
coins++;
}
else if (sum >= 1)
{
sum -= 1;
coins++;
}
else if (sum >= 0.50)
{
sum -= 0.5;
coins++;
}
else if (sum >= 0.20)
{
sum -= 0.2;
coins++;
}
else if (sum >= 0.10)
{
sum -= 0.1;
coins++;
}
else if (sum >= 0.05)
{
sum -= 0.05;
coins++;
}
else if (sum >= 0.02)
{
sum -= 0.02;
coins++;
}
else if (sum>= 0.01)
{
sum -= 0.01;
coins++;
}
}
Console.WriteLine(coins);
}
}
}
Браво, супер е решението!
Позволих си да копирам начина на решение и да го превърна в C# код (много трудно, 2 промени направих), понеже я имахме като задача в C# PB. Ето го за зациклилите като мен там:
using System;
class MainClass
{
public static void Main (string[] args)
{
double money = double.Parse(Console.ReadLine());
int coin = 0;
money = Math.Round(money * 100);
while (money > 0)
{
if (money >= 200)
{
coin++;
money = money -200;
}
else if (money >= 100)
{
coin++;
money = money -100;
}
else if (money >= 50)
{
coin++;
money = money -50;
}
else if (money >= 20)
{
coin++;
money = money -20;
}
else if (money >= 10)
{
coin++;
money = money -10;
}
else if (money >= 5)
{
coin++;
money = money -5;
}
else if (money >= 2)
{
coin++;
money = money -2;
}
else if (money >= 1)
{
coin++;
money = money -1;
}
}
Console.WriteLine(coin);
}
}
Привет!
След като цял ден си блъскам главата с тази задача и гледам различни решения, си позволих да преработя вашето. Направих само 2 промени и то сработи - махнах проверките за 1000, 500.. до 2лв, защото ми се виждат излишни след като търсим ресто на машина, която работи само с дребни банкноти и монети. По принцип и с тях не е проблем.
След това пуснах кода в дебъг режим и още на първата врътка забелязах, че закръгленията на double могат да направят проблем при повече инициации, затова се върнах нагоре в кода и направих това, което и колегите по-горе - умножих рестото по 100 (за да не използваме закръгленията на double) и после използвах Math.Round за даполучим цяло число (макар и от тип double). Според мен грешните резултати са точно от закръгленията на double в някой от тестовете.
Ето и вашият код с тези 2 промени, взе 100/100 точки в Judge:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _05.Coins
{
class Program
{
static void Main(string[] args)
{
double sum = double.Parse(Console.ReadLine());
int coins = 0;
sum = Math.Round(sum * 100);
while (sum > 0)
{
if (sum >= 200)
{
sum -= 200;
coins++;
}
else if (sum >= 100)
{
sum -= 100;
coins++;
}
else if (sum >= 50)
{
sum -= 50;
coins++;
}
else if (sum >= 20)
{
sum -= 20;
coins++;
}
else if (sum >= 10)
{
sum -= 10;
coins++;
}
else if (sum >= 5)
{
sum -= 5;
coins++;
}
else if (sum >= 2)
{
sum -= 2;
coins++;
}
else if (sum >= 1)
{
sum -= 1;
coins++;
}
}
Console.WriteLine(coins);
}
}
}
а може просто да ползвате decimal
В контекста на домашното още не знаем за decimal
В контекста да станете програмисти, не чакайте само лекции и домашни. И този тест ви чупи точно защото там е decimal и ако се ползва decimal си минават.
А за добрите практики никога е е късно. Става ли дума за пари винаги се ползва decimal заради спецификите на закръгляне на 2та primitive types.
Ок, взимам си бележка за всички бъдещи задачи, свързани с пари
Бележката трябва да е по-обща.
Да гледаш за нещо ново или различно или edge case. На лекции упражнения никога няма да ви кажат всичко просто няма време, а и поняокга нарочно се слагат уловки, а и ако сте избрали пътя винаги трябва да се рови. Е днес е неделя но пак уча нови неща копая в kubernetis. А можеше да си пия бирата или нещо подобно.