Complex Conditional Statements - 13. Volleyball - Разминаване в отговорите
Здравейте,
Някой да има идея къде греша? Благодаря предварително.
И защо вместо 3/4 трябва да се ползва 3.0/4?
Задача 13. Volleyball
Влади е студент, живее в София и си ходи от време на време до родния град. Той е много запален по волейбола, но е зает през работните дни и играе волейбол само през уикендите и в празничните дни. Влади играе в София всяка събота, когато не е на работа и не си пътува до родния град, както и в 2/3 от празничните дни. Той пътува до родния си град h пъти в годината, където играе волейбол със старите си приятели в неделя. Влади не е на работа 3/4 от уикендите, в които е в София. Отделно, през високосните години Влади играе с 15% повече волейбол от нормалното. Приемаме, че годината има точно 48 уикенда, подходящи за волейбол.
Напишете програма, която изчислява колко пъти Влади е играл волейбол през годината. Закръглете резултата надолу до най-близкото цяло число (например 2.15 à 2; 9.95 à 9).
Входните данни се четат от конзолата:
- Първият ред съдържа думата “leap” (високосна година) или “normal” (невисокосна).
- Вторият ред съдържа цялото число p – брой празници в годината (които не са събота и неделя).
- Третият ред съдържа цялото число h – брой уикенди, в които Влади си пътува до родния град.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volleyball13
{
class Volleyball13
{
static void Main(string[] args)
{
var year = Console.ReadLine().ToLower();
var p = int.Parse(Console.ReadLine());
var hweekends = int.Parse(Console.ReadLine());
var sweekends = 48 - hweekends;
var playdays = (sweekends * 3.0 / 4) + (2.0 / 3 * p) + hweekends;
if (year == "normal")
{
Console.WriteLine("{0:f0}", playdays);
}
else if(year == "leap")
{
Console.WriteLine("{0:f0}", playdays * 0.15 + playdays);
}
}
}
}
Плюс това условието доста ме затруднява:
Влади играе в София всяка събота (а не кой да е weekend), когато не е на работа и не си пътува до родния град =>
Дните, в които той играе в София не са sweekends * 3.0 / 4, а sweekends * 3.0 / 4 / 2 ( за да изключим неделя) ?
ето го и моят,дава 100 точки
var type = Console.ReadLine().ToLower();
var p = double.Parse(Console.ReadLine());
var h = double.Parse(Console.ReadLine());
var volley = (h + ((48 - h) * (3.0 / 4)) +( p * (2.0/3)));
if (type == "normal")
{
Console.WriteLine(Math.Truncate(volley));
}
if (type == "leap")
{
Console.WriteLine(Math.Truncate((volley* 0.15) +volley));
}
Тук искам да предложа една промяна към условието на задачата. Да не се въвежда ръчно високосна/нормална година, а да се изчислява програмно :) Правилото е - високосна е годината, за която последните две цифри е число, което се дели точно на 4 - без остатък. Изключение прави 2000 година, за която трябва да се провери отделно.
Също така вместо Math.Truncate, може да се използва изваждане на 0.5, ако закръгляваме към цяло число или 0.005, ако закръгляваме до 2 цифри след десетичната запетая. Двоичният код доста намалява. Това може да се приложи в микроконтролери, където се гони по-малко двоичен код и по-голямо бързодействие. Вероятно и Джъдж може да потвърди този факт :)
Здравей,
наистина има проблеми ако използваш деление вместо десетична дроб.
Ако ползваш десетична дроб в ексел направи конкретното деление и след това
копирай от ексел абсолютно целия резултат от конкретното деление, колкото и да е дълъг той и ще си
на 100% сигурен в успеваемостта на кода. По този начин може да възникне само един проблем - десетична дроб в период, но рядко се среща. В конкретния пример 2/3 е ето това число 0.666666667 и със него кода ми работи на 100%.
Дано съм бил полезен.
Ето и моят код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ValeyBall
{
class Program
{
static void Main(string[] args)
{
var leapN = Console.ReadLine();
var praznici = double.Parse(Console.ReadLine());
var home = int.Parse(Console.ReadLine());
var sofWeek = 48 - home;
var SaturdayPlaySof = (sofWeek * 0.75);
var prazniciPlaySof = (praznici * 0.666666667);
var totalPlaysSofHome = SaturdayPlaySof + home + prazniciPlaySof;
if (leapN == "leap")
{
var leapYear = (totalPlaysSofHome * 15) / 100;
var leapYearPlays = totalPlaysSofHome + leapYear;
Console.WriteLine (Math.Floor (leapYearPlays));
}
else
{
Console.WriteLine(Math.Floor(totalPlaysSofHome));
}
}
}
}