Просто чтобы все знали, я впервые обращаюсь за помощью по переполнению стека.Я обычно ищу сайт и нахожу удовлетворительный ответ или копаю дальше на MSDN или других сайтах.Но на этот раз я серьезно застрял.
Я получил программную проблему от вербовщика, которую я должен заполнить, чтобы отправить клиенту запрос, чтобы узнать, хотят ли они мне позвонить. Вот проблема: для любого заданного значения определите количество способов, которым это значение можетбыть представленными номиналами $ 100, $ 50, $ 20, $ 10, $ 5, $ 1, .25, .10, .05, .01
Я никогда не принимал тригонометрию или исчисление, и я никогда не сталкивался с чем-то таким математически сложным вмои 14 лет программирования.Они хотят получить ответ на C #, так как это магазин Microsoft .NET.
Рекрутер дал мне код другого кандидата, который он представил.Этот человек должен быть блестящим математиком, поскольку она действительно написала весь алгоритм для достижения желаемого результата.Я подключил его к веб-странице, и он на самом деле удовлетворяет требованиям.Проблема в том, что я даже не могу понять это и понять это так, чтобы я мог написать свою собственную реализацию.
Я действительно очень хочу эту работу, как это звучит при запуске в Нью-Йорке, что звучитотличный.Я смог ответить на вторую проблему, так как это был вопрос об архитектуре / дизайне, но этот вопрос меня смущает.
Кстати, я посмотрел в Википедии проблему смены монет и типа ранца, и она выходит далеко за рамки моей математическойнавыки.Я даже не могу прочитать ответы, потому что я не понимаю исчисления.Поэтому мне нужна серьезная помощь в этом.
Вот ее код, который работает, кстати:
protected void Page_Load(object sender, EventArgs e)
{
var numberToSplit = new List<int>() {123};
foreach (int a in numberToSplit)
{
Response.Write(a + " can be split in ");
foreach (List<double> splits in GetDenominations(a).Values)
{
foreach (double b in splits)
{
Response.Write(b + ",");
}
//next split
Response.Write("<br/>");
}
Response.Write("<br/>");
}
}
public Dictionary<double, List<double>> GetDenominations(int value)
{
var denominations = new List<double> {100, 50, 20,10,5,1,0.25,0.10,0.05,0.01};
var AllPossibleSplits = new Dictionary<double, List<double>>();
var hightestdenomination = 100.0;
while (hightestdenomination != 0)
{
var remainingDenominations =
denominations.Where(a => (a <= value && !AllPossibleSplits.Keys.Contains(a)));
if (remainingDenominations.Count() > 0)
hightestdenomination = remainingDenominations.Max();
else
hightestdenomination = 0;
var splits = new List<double>();
if (hightestdenomination != 0)
{
int valueToSplit = value;
while (valueToSplit > 0)
{
foreach (double denomination in remainingDenominations.Where(a => a <= valueToSplit))
{
int absoluteValue = (int) (valueToSplit/denomination);
valueToSplit = valueToSplit - (int) (absoluteValue*denomination);
int absoluteValueSplit = 0;
while (absoluteValueSplit < absoluteValue)
{
splits.Add(denomination);
absoluteValueSplit++;
}
}
}
}
AllPossibleSplits[hightestdenomination] = splits;
}
return AllPossibleSplits;
}