Задача про наименьшее количество купюр и рекурсия - C#

Узнай цену своей работы

Формулировка задачи:

Вот такая классическая задачка есть: В некоторой стране используются денежные купюры достоинством в 1, 2, 4, 8, 16, 32 и 64. Дано натуральное число п. Как наименьшим количеством таких денежных купюр можно выплатить сумму п (указать количество каждой из используемых для выплаты купюр)? Предполагается, что имеется достаточно большое количество купюр всех достоинств. С вечера что то не думалось, а вот с утра написал рекурсию. Ребят мне кажется я тут намудрил, как это упростить, если возможно(только рекурсия).
namespace kupur
{
    class Program
    {
        static void Podschet_kupyur(int sum, int kup)
        {
            if (kup > 0)
            {
                if (sum >= kup)
                {
                    int kolvo = sum / kup;
                    int count = sum % kup;
                    sum = count;
                    if (sum <= kup)
                    {
                        Podschet_kupyur(sum, kup / 2);
                    }
                    Console.WriteLine("Купюр номиналом {0}\t{1} штук", kup, kolvo);
                }
                else
                {
                    Podschet_kupyur(sum, kup / 2);
                }
            }
        }
        
        static void Main(string[] args)
        {
            Console.WriteLine("Введи сумму ");
            int s = Convert.ToInt32(Console.ReadLine());
            int k = 64;
            Podschet_kupyur(s, k);
            Console.ReadKey();
        }
    }
}

Решение задачи: «Задача про наименьшее количество купюр и рекурсия»

textual
Листинг программы
using System;
 
/*
 * В некоторой стране используются денежные купюры достоинством в 1, 2, 4, 8, 16, 32 и 64.
 * Дано натуральное число п. Как наименьшим количеством таких денежных купюр можно выплатить
 * сумму п (указать количество каждой из используемых для выплаты купюр)? Предполагается, что
 * имеется достаточно большое количество купюр всех достоинств.
 */
namespace Recursion
{
    class WrongDataException : Exception
    {
        public override string ToString()
        {
            return "Введены неправильные данные";
        }
    }
    class Recursion
    {
        int _n = 1;
        public void Initialization()
        {
            Console.WriteLine("Введите сумму выплаты (целое положительное число)");
            try
            {
                int temp = int.Parse(Console.ReadLine());
                if (temp > 0)
                    _n = temp;
                else throw new WrongDataException();
            }
            catch (WrongDataException exc)
            {
                Console.WriteLine(exc);
            }
            finally {_difference = _n;}
        }
 
        private int _biggestValue=64;
        private int _difference;
        private int DivideBanknoteByTwo()
        {
            int numberOfPapers = _difference/_biggestValue;
            
            if(_difference%_biggestValue==0)
                return numberOfPapers;
 
            _difference -= numberOfPapers * _biggestValue;
            _biggestValue /= 2;
 
            return (DivideBanknoteByTwo() + numberOfPapers);
        }
 
        public void ShowNumberOfBanknotes()
        {
            Console.WriteLine("Наименьшее количество банкнот, " +
                              "которыми можно расплатиться" +
                              " за {0} составляет {1}.",
                              _n, DivideBanknoteByTwo());
            Console.ReadKey();
        }
    }
 
    class Program
    {
        static void Main()
        {
            Recursion _recursion=new Recursion();
            _recursion.Initialization();
            _recursion.ShowNumberOfBanknotes();
        }
    }
}
/*
 * можно проверять сумму по модулю банкноты последовательным делением на 2 до тех пор, пока 
 * остаток равен нулю. Запоминаем последнее правильное решение в аккумуляторе. Вычитаем от введенного
 * п сумму и продолжаем с остатком те же действия. Наверное, всё это можно сделать через рекурсию.
 */

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.571 из 5
Похожие ответы