Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
kotd
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 19
1

Написать программу определения количества шестизначных счастливых билетов

10.04.2015, 23:29. Просмотров 2907. Ответов 10
Метки нет (Все метки)

4. Написать программу определения количества шестизначных “счастливых”' билетов, у которых сумма первых 3 десятичных цифр равна сумме 3 последних десятичных цифр.

Я решил задачу с помощью цикла. Как решить с помощью механизма рекурсии (ещё один метод) ?

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
 static int HappyTicketsCycle ()
 
        {
            int a, a1, a2, a3, a4, a5;
            byte count = 0;
 
            for (a = 0; a <= 9; a++)
                for (a1 = 0; a1 <= 9; a1++)
                    for (a2 = 0; a2 <= 9; a2++)
                        for (a3 = 0; a3 <= 9; a3++)
                            for (a4 = 0; a4 <= 9; a4++)
                            {
                                a5 = (a + a1 + a2) - (a3 + a4);
 
                                if (a5 >= 0 && a5 <= 9)
                                    count += 1;
 
                            }
 
            return count;
        }
 
          
        
 
 
        static void Main(string[] args)
        {
            Console.WriteLine("Количество счастливых билетов: {0} ", HappyTicketsCycle()); //цикл
            HappyTicketsCycle();
        }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2015, 23:29
Ответы с готовыми решениями:

Написать программу определения количества шестизначных счастливых билетов
Написать программу определения количества шестизначных “счастливых”' билетов, у которых сумма...

Подсчет счастливых билетов
Здравствуйте! Думаю, каждый программист когда-то в самом начале своей карьеры писал приложение,...

Найти номера счастливых билетов
Троллейбусный билет имеет шестизначный номер. Билет назовем &quot;счастливым&quot;, если сумма первых трех...

Найти количество счастливых билетов
Назовем билет счастливым, если в его номере abcd (от 0000 до 9999) a+c=b+d. Найти количество таких...

Поиск номеров счастливых билетов
Билеты хранятся в рулонах и нумеруются от 000000 до 999999. Назовём &quot;счастливым&quot; билет, у которого...

10
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
11.04.2015, 10:36 2
а не маловато счастливчиков?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        static void Main(string[] args)
        {
            int count = 0;
            Console.BufferHeight = 4600;
            for (int n = 100001; n < 1000000; n++)
            {
                string s = n.ToString();
                if (s[0] + s[1] + s[2] == s[3] + s[4] + s[5])
                {
                    Console.Write(s + " ");
                    count++;
                    if (count % 11 == 0) Console.WriteLine();
                }
            }
            Console.WriteLine("\ncount={0}", count);
            Console.ReadKey(true);
        }
0
valera_21
383 / 364 / 97
Регистрация: 05.01.2010
Сообщений: 1,514
Завершенные тесты: 5
11.04.2015, 19:17 3
Цитата Сообщение от MansMI Посмотреть сообщение
а не маловато счастливчиков?
к вам такой же вопрос
0
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
11.04.2015, 21:31 4
Предложу свой вариант. Не рекурсия, но тоже ничего ))
C#
1
2
3
4
5
6
            Func<int, bool> isHappy = (int num) =>
                {
                    var digits = num.ToString("000000").Select(c => Int32.Parse(c.ToString()));
                    return (digits.Take(3).Sum() - digits.Skip(3).Sum()) == 0;
                };
            Console.WriteLine( (from int n in Enumerable.Range(0, 1000000) where isHappy(n) select n).Count());
0
11.04.2015, 21:31
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
12.04.2015, 18:57 5
MansMI, diadiavova, Зачем тут вообще строки?

kotd, Рекурсивный вариант
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
               public static void Main(string[] args)
        {
            int res = LuckyTicket(999999);
        }
 
        private static int LuckyTicket(int n)
        {
            if (n < 0) return 0;
            // Первые 3 цирфы
            int firstPart = n / 1000;
            // Вторые 3 цифры
            int secondPart = n % 1000;
 
            int fS = DigitsSum(firstPart);
            int sS = DigitsSum(secondPart);
 
            if (fS == sS) return 1 + LuckyTicket(n - 1);
            else return 0 + LuckyTicket(n - 1);
        }
 
 
        private static int DigitsSum(int n)
        {
            int ones = n % 10; // Единицы
            int tens = (n % 100) / 10; // Десятки
            int hundrens = n / 100; // Сотни
 
            return ones + tens + hundrens;
        }
Итеративный
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
                public static void Main(string[] args)
        {
            int res = LuckyTicket(999999);
        }
 
        private static int LuckyTicket(int n)
        {
            int count = 0;
            for (int i = 0; i < n; n++)
            {
                // Первые 3 цирфы
                int firstPart = i / 1000;
                // Вторые 3 цифры
                int secondPart = i % 1000;
 
                int fS = DigitsSum(firstPart);
                int sS = DigitsSum(secondPart);
 
                if (fS == sS) count++;
            }
 
            return count;
        }
 
 
        private static int DigitsSum(int n)
        {
            int ones = n % 10; // Единицы
            int tens = (n % 100) / 10; // Десятки
            int hundrens = n / 100; // Сотни
 
            return ones + tens + hundrens;
        }
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
12.04.2015, 19:08 6
с рекурсией
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
        static void Main(string[] args)
        {
            int count = 0;
            
            Console.BufferHeight = 5030;//если выводить номера
            SetChar(new char[6], 0, ref count);
            Console.WriteLine("\ncount={0}", count);
            Console.ReadKey(true);
        }
 
        static void SetChar(char[] s, int n, ref int count)
        {
            for (char ch = '0'; ch <= '9'; ch++)
            {
                s[n] = ch;
                if (n < 5) SetChar(s, n + 1, ref count);
                else
                    if (s[0] + s[1] + s[2] == s[3] + s[4] + s[5])
                    {
                        count++;
                        //если выводить номера
                        Console.Write(new string(s) + " ");
                        if (count % 11 == 0) Console.WriteLine();
                    }
            }
               
        }
0
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
12.04.2015, 19:13 7
Цитата Сообщение от XRoy Посмотреть сообщение
diadiavova, Зачем тут вообще строки?
Да собственно для наглядности. Я прекрасно понимаю, что с точки зрения той же производительности такой вариант не катит. Но так ли важна производительность в данном случае? Функция одноразовая и если будет сэкономлена секунда на вычисление, то что это даст? Ну вот такой вариант реализации IsHappy по производительности гораздо лучше
C#
1
2
3
4
5
6
7
8
9
10
        static bool IsHappy(int num)
        {
            int[] digits = new int[6];
            int divresult = num;
            for (int i = 0; i < 6; i++)
            {
                divresult = Math.DivRem(divresult, 10, out digits[i]);                
            }
            return (digits[0] + digits[1] + digits[2]) == (digits[3] + digits[4] + digits[5]);
        }
Но в наглядности он явно теряет. В первоначальном варианте хорошо видно, что число превращается в коллекцию цифр, которая превращается в коллекцию чисел и в конце концов сумма первых трех сравнивается с суммой последних трех. А что делается здесь - вообще без ста грамм не разберешься.

Добавлено через 1 минуту
И, кстати, вместо
C#
1
from int n in Enumerable.Range(0, 1000000) where isHappy(n) select n).Count()
Можно написать
C#
1
Enumerable.Range(0, 1000000).Count(IsHappy)
0
kotd
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 19
12.04.2015, 21:46  [ТС] 8
Спасибо) Вы тут ребята понаписывали, того что мы и не изучали даже Будем разбираться
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
12.04.2015, 21:53 9
так обычно и бывает, один *** вопрос задаст, что и 10 мудрецов не разберутся
0
kotd
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 19
14.04.2015, 00:03  [ТС] 10
Кстати, маловато у меня было билетов, ибо не хватало { } . Щас переписал внимательно, столько же сколько у вас) 55252 ) Так что даже мой простой способ проканал , мудрецы) А вот с рекурсией надо разобраться

Добавлено через 6 минут
Хотя какие скобки. Там у count был тип byte . Вот в чём дело

Добавлено через 2 часа 27 минут
Process is terminated due to StackOverFlowException
0
kolorotur
Эксперт .NET
11309 / 9203 / 2336
Регистрация: 17.09.2011
Сообщений: 15,812
Завершенные тесты: 1
14.04.2015, 10:00 11
Цитата Сообщение от kotd Посмотреть сообщение
Написать программу определения количества шестизначных “счастливых”' билетов, у которых сумма первых 3 десятичных цифр равна сумме 3 последних десятичных цифр.
Это число — константа, нет?
0
14.04.2015, 10:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2015, 10:00

Приложение должно показывать количество счастливых билетов
Всем здрасти!Мне нужно приложение которое будет ввиде обычного окошка,смысл таков что это...

Подсчитать число счастливых шестизначных цифр, у которых сумму трех цифр равна 13
Назовем шестизначное число счастливым, если сумма первых его трех цифр равна сумме последних трех...

Подсчитать число счастливых шестизначных цифр, у которых сумма трех цифр равна 13
Всем привет,нужна помощь. &quot;Назовем шестизначное число счастливым, если сумма первых его трех цифр...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru