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
https://pastebin.com/ANLHpjwn не знам колко добре съм го направила, но джъдж ми дава 100/100. .Реших с 2 while цикъла да го направя защото иначе с толкова много for цикли ми се стори малко неприятно особено ако трябва да си търся грешки и да дебъгвам.
https://pastebin.com/iSw9eH9W Ето и моето решение само с if - ове.
Ето още едно излишно сложно решение....моето: 1 while цикъл + много else-if проверки
Аз успях да намеря просто решение само с делене и модулно делене на под 40 реда: https://pastebin.com/R4J6RLAn
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);
}
}
}
Благодаря. В крайна сметка ми помогна да си открия грешката.
Може да е полезно, ако някой се интересува. Явно проблема беше, че приравнявам стотинката към лев, а не обратното- 1 стотинка = 0,01лв , а трябва да е 1лв = 100 стотинки.
Здравей,
според мен не ти е там грешката, 1 стотинка си е 0.01, но DECIMAL !!! Винаги когато става дума за пари или прецизни сметки с плаваща запетая, използвай decimal data type. Ако ти е интересно потърси за "неточността" на float и double. Конкретно в кода ти промених
decimal n = decimal.Parse(Console.ReadLine());
после и това за да не цикли излишно
for (int g = 0; g < 2; g++)
и накрая кастнах
((decimal)(a * 0.01 + b * 0.02 + c * 0.05 + d * 0.10 + e * 0.20 + f * 0.50 + g * 1.00 + h * 2.00) != n)
даде 100/100