CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум .NET > Форум C# .NET > Форум C# для начинающих

Ответ Создать новую тему
 
Старый 03.02.2012, 15:02   #1
Rossi46
Новичок
 
Регистрация: 03.02.2012
Сообщений: 1
Репутация: 0 (0)
По умолчанию Задача разбиения суммы на выдачу минимальным количеством банкнот

Необходимо определить, как заданную сумму денег выразить минимальным количеством банкнот по 500, 100, 10, 5, 2 и 1 рублю.

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 static void Main(string[] args)
        {
            Int64 summa = 0, b500 = 0, b100 = 0, b10 = 0, b5 = 0,b2=0, b1 = 0;
            Console.WriteLine("Введите сумма денег для расчета");
            summa = Convert.ToInt64(Console.ReadLine());
           do
           { 
               if (summa % 500 >= 1)
                    {
                    summa = summa - 500;
                    b500++;
                    }    
                            else if (summa % 100 >= 1)
                                        {
                                            summa = summa - 100;
                                            b100++;
                                                }
                                                else if (summa % 10 >= 1)
                                                               {
                                                                summa = summa - 10;
                                                                b10++;
                                                                }
                                                                else if (summa % 5 >= 1)
                                                                            {
                                                                              summa = summa - 5;
                                                                              b5++;
                                                                             }
                                                                                else if (summa % 2 >= 1)
                                                                                            {
                                                                                             summa = summa - 2;
                                                                                             b2++;
                                                                                             }
                                                                                                else
                                                                                                        {
                                                                                                        b1 = summa;
                                                                                                        summa = 0;
                                                                                                           }
                                                                                      
                                                      
 
                               
    
           }
           
while(b1>=1);
 Console.WriteLine("Количество купюр для выдачи суммы {0} пятисоток, {1} соток, {2} десяток, {3} пятерок, {4} двоек и {5} единичных банкнот", b500,b100,b10,b5,b2,b1);
            Console.ReadLine();} 
    }


почему цикл не верно работает?!(

Добавлено через 33 минуты
собственно меня смущает тот факт что выход происходит по while(b1>0) когда b1 равно 0

Последний раз редактировалось nio; 03.02.2012 в 14:35. Причина: Используйте теги форматирования кода
Rossi46 вне форума
Другие темы раздела
C# Определить элементы, которые есть в первом и отсутствуют во втором массиве
помоги решить задачку: есть два datagrid'a, в них содержатся различные фамилии, нужно определить фамилию, которая отсутствует во втором гриде из первого грида ) вот пример, в данном случае получается, что фамилия 4 отсутствует во втором гриде и его необходимо вывести. Определить элементы, которые есть в первом и отсутствуют во втором массиве
Есть ли для Visual C# 2010 Express скины
Есть ли для Visual C# 2010 Express скины? как на подобоииhttp://www.alphaskins.com и как инструкция по использованию можно ? Если есть. Есть ли для Visual C# 2010 Express скины
Старый 03.02.2012, 15:13   #2
tantemka
Амурчанка
 
Аватар для tantemka
 
Регистрация: 07.11.2011
Сообщений: 273
Репутация: 121 (121)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Замените деление по модулю (%) на обычное (/) и условие while поменяйте на
Код C#
1
while (summa!=0);
tantemka вне форума
Старый 03.02.2012, 16:50   #3
KarmaMaker
Форумчанин
 
Аватар для KarmaMaker
 
Регистрация: 09.12.2011
Сообщений: 228
Репутация: 84 (84)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

собственно меня смущает тот факт что выход происходит по while(b1>0) когда b1 равно 0
А больше тебя в твоем коде ничего не смущает?

Держи, и не пиши так больше, бо черевато получением физических увечий.
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
 
namespace JustForFun
{
    class MainClass
    {
        public static void Main ()
        {
            // Используемые номиналы
                        int[] FaceValues = { 500, 100, 50, 10, 5, 2, 1 };
            // Список необходимых банкнот
                        List<int> requiredBanknotes = new List<int>();
            
                        Console.WriteLine( "Введите сумму" );
            int sum;
            while(!Int32.TryParse( Console.ReadLine(), out sum ) || sum < 1 ){
                Console.WriteLine( "Сумма должна быть натуральным числом" );
            }   
            
                        // Расчет необходимых банкнот
            int nominalCounter = 0; 
            while( sum >= 1 )
            {
                int currValue = FaceValues[ nominalCounter ];
                if( currValue <= sum )
                {
                    requiredBanknotes.Add( currValue );
                    sum -= currValue;
                }
                else
                {
                    nominalCounter++;
                }
            }
            
                        // Вывод списка необходимых банкнот
            requiredBanknotes.ForEach( Console.WriteLine );
            Console.ReadLine();
        }
    }   
}
KarmaMaker вне форума
Старый 03.02.2012, 17:03   #4
nio
Модератор
 
Аватар для nio
 
Регистрация: 14.06.2009
Адрес: Беларусь
Сообщений: 5,163
Репутация: 3336 (1924)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Цитата Сообщение от KarmaMaker Посмотреть сообщение
А больше тебя в твоем коде ничего не смущает?
+1
nio вне форума
Старый 03.02.2012, 19:29   #5
ibmpc
Форумчанин
 
Аватар для ibmpc
 
Регистрация: 28.12.2011
Адрес: Ташкент
Сообщений: 183
Репутация: 70 (68)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Так должно быть быстрее.
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dictionary<int, int> Dic = new Dictionary<int, int>();
int[] FaceValues = { 500, 100, 50, 10, 5, 2, 1 };
Console.Write("Введите сумму: ");
int sum;
while (!Int32.TryParse(Console.ReadLine(), out sum) || sum < 1)
{
  Console.WriteLine("Сумма должна быть натуральным числом");
  Console.Write("Введите сумму: ");
}
 
foreach (int item in FaceValues)
{
  Dic.Add(item,sum / item );
  sum %= item;
  if (sum == 0) break;
}
 
foreach (KeyValuePair<int,int> item in Dic)
{
 Console.WriteLine("{0:C} - {1}", item.Key, item.Value);
}
Console.ReadLine();
То же самое с другим подходом к выводу на консоль
ibmpc вне форума
Старый 03.02.2012, 19:50   #6
KarmaMaker
Форумчанин
 
Аватар для KarmaMaker
 
Регистрация: 09.12.2011
Сообщений: 228
Репутация: 84 (84)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Решение ibmpc пожалуй более корректно ( Хотя не очень понятно зачем было затирать комментарии, да и стиль оставляет желать лучшего ).
KarmaMaker вне форума
Старый 03.02.2012, 20:18   #7
ibmpc
Форумчанин
 
Аватар для ibmpc
 
Регистрация: 28.12.2011
Адрес: Ташкент
Сообщений: 183
Репутация: 70 (68)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Цитата Сообщение от KarmaMaker Посмотреть сообщение
Хотя не очень понятно зачем было затирать комментарии, да и стиль оставляет желать лучшего ).
Коментарии не затирал, просто взял верхушку для ввода суммы из вашего варианта - суть ведь не в этом. А насчет стиля можно подробней и желательно с объяснением?
ibmpc вне форума
Старый 04.02.2012, 00:53   #8
KarmaMaker
Форумчанин
 
Аватар для KarmaMaker
 
Регистрация: 09.12.2011
Сообщений: 228
Репутация: 84 (84)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Названия переменных не отражают их назначения: Например, если не вглядываться в код, то совершенно не понятно что здесь выводится:
Код C#
1
2
3
4
foreach (KeyValuePair<int,int> item in Dic)
{
 Console.WriteLine("{0:C} - {1}", item.Key, item.Value);
}
Понятно, что объем написанного не большой и разобраться что есть что не проблема, но все таки.

Использование break в foreach тоже вроде как некомильфо, ибо для каждого, значит для каждого ( вообще этот if у тебя несколько странно работает** )


Мне кажется так лучше:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
namespace JustForFun
{
    class MainClass
    {
        public static void Main ()
        {
            Console.WriteLine ("Введите сумму: ");
            int sum;
            while (!Int32.TryParse (Console.ReadLine (), out sum) || sum <= 0) 
            {
                Console.WriteLine ("Сумма должна быть натуральным числом попробуйте еще раз:");
            }
 
            int[] faceValues = { 500, 100, 50, 10, 5, 2, 1, };
            List<Banknote> banknotes = new List<Banknote>();
            foreach( int nominal in faceValues )
            {
                if( nominal <= sum )
                {
                    banknotes.Add( new Banknote( faceValue: nominal, requiredAmnt: sum/nominal));
                    sum %= nominal;
                }
            }
            
            banknotes.ForEach( Console.WriteLine );
            Console.ReadLine ();
        }
        
        class Banknote
        {
            public Banknote( int faceValue, int requiredAmnt = 0 )
            {
                FaceValue = faceValue;
                RequiredAmnt = requiredAmnt;
            }
            public int FaceValue{get; private set;}
            public int RequiredAmnt{get; private set;}
            override public string ToString()
            {
                return "Номинал: " + FaceValue + ",\tнеобходимое количество: " + RequiredAmnt;
            }
        }
    }
}
Кину камень в свой же огород название Banknote не полностью отражает суть класса.

**Если банкнота с каким то номиналом не использовалась, то ее вывод зависит от того следуют ли за ней используемые банкноты или нет.
KarmaMaker вне форума
Старый 04.02.2012, 11:06   #9
ibmpc
Форумчанин
 
Аватар для ibmpc
 
Регистрация: 28.12.2011
Адрес: Ташкент
Сообщений: 183
Репутация: 70 (68)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

Цитата Сообщение от KarmaMaker Посмотреть сообщение
вроде как некомильфо, ибо для каждого, значит для каждого ( вообще этот if у тебя несколько странно работает** )
Почему некомильфо подробней? И что значит странно (к условиям это понятие мало применимо )? Насчет имен переменных понял, не могу взять за правило, чтобы делать на автомате, хотя давно знаю.
И еще в твоем варианте класс Banknote зачем он нужен для этой задачи? Чем хуже Dictionary<> ? По моему вы напрасно усложнили код.
ibmpc вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 04.02.2012, 11:40   #10
KarmaMaker
Форумчанин
 
Аватар для KarmaMaker
 
Регистрация: 09.12.2011
Сообщений: 228
Репутация: 84 (84)
По умолчанию Re: Задача разбиения суммы на выдачу минимальным количеством банкнот

И что значит странно
**Если банкнота с каким то номиналом не использовалась, то ее вывод зависит от того следуют ли за ней используемые банкноты или нет.
Чем хуже Dictionary<> ?
Ви таки будете смеяться, но отсутствием нужного ToString() + названия лучше:
banknote.FaceValue vs Dic.Key
KarmaMaker вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
Turbo Pascal обработка строк. получить слово с минимальным количеством гласных букв.
получить слово с минимальным количеством гласных букв.
Leylala
C++ Написать жадный алгоритм формирования сдачи с 1 рубля минимальным количеством монет при покупки товара ценой X копеек
Раньше были монеты достоинством 1, 2, 3, 5, 10, 15, 20 и 50 копеек. Написать жадный алгоритм формирования сдачи с 1 рубля минимальным количеством монет при покупки товара ценой X копеек. X < 100.
proger2030
Pascal (Паскаль) Дана матрица в столбцах с минимальным количеством отрицательных элементов все положительные элементы заменить на 0
Дана матрица A в столбцах с минимальным количеством отрицательных элементов все положительные элементы заменить на 0 Не могу решить задачу.. Помогите с решением.
warexs
Pascal (Паскаль) Набрать сумму минимальным количеством денежных знаков.
87. (6 б.) Касса. В массиве K(n) в порядке убывания представлены достоинства денежных знаков (купюр и монет) валютной системы некоторой страны. Реализовать выдачу в этой системе заданной суммы m минимальным числом денежных знаков. плиииизз
vivs_21
Алгоритмы где я могу прочитать про темы Задача разбиения и Алгоритм MAXMIN(S)
Привет всем. Подскажите пожалуйста где я могу прочитать про темы Задача разбиения, Алгоритм MAXMIN(S). Заранее огромное спасибо...:tender:
Yoli
Опции темы

Текущее время: 01:15. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика