Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Exam Problems] C# Basics - Nine-DIgit Magic Numbers - OutOfMemoryException

Написах кода на задачата и в конзолата работи нормално. Разбира се, няма как ръчно да проверя дали е намерило всички числа, отговарящи на условието, но тези, които ги намира, отговарят. Но при опит за тест ми изведе следната грешка:

 

Първоначално предположих, че програмата е прекалено голяма, но реално заема 8 МБ. И не мога да разбера какво се случва. Втора задача, за която конзолата и Judge дават различен аутпут.

Zero test #1 (Runtime error)

The zero tests are not included in the final result.
Unhandled Exception: OutOfMemoryException.
Time used: 0.012 s
Memory used: 8.79 MB

 

Надолу можете да видите и кода. Нищо сложно - с девет цикъла един в друг вадя всяко едно деветцифрено число, съдържащо цифри 1-7. Записвам числата в масив и ги сортирам в друг.

 

using System;


    class NineDigitMagicNumbers
    {
        static void Main()
        {
            int sum = int.Parse(Console.ReadLine());
            int diff = int.Parse(Console.ReadLine());
            int a,b, c, d, e, f, g, h, i = 0;
            int[] container = new int[41000000];
            int magicCounter = 0;
            int abc, def, ghi;
            for(int j1=1; j1<=7; j1++)
            {
                a = j1;
                for(int j2=1; j2<=7; j2++)
                {
                    b = j2;
                    for(int j3=1; j3<=7; j3++)
                    {
                        c = j3;
                        for (int j4 = 1; j4 <= 7; j4++)
                        {
                            d = j4;
                            for(int j5=1; j5<=7; j5++)
                            {
                                e = j5;
                                for(int j6=1; j6<=7; j6++)
                                {
                                    f = j6;
                                    for(int j7=1; j7<=7; j7++)
                                    {
                                        g = j7;
                                        for(int j8=1; j8<=7; j8++)
                                        {
                                            h = j8;
                                            for(int j9=1; j9<=7; j9++)
                                            {
                                                i = j9;
                                                abc = 100 * a + 10 * b + c;
                                                def = 100 * d + 10 * e + f;
                                                ghi = 100 * g + 10 * h + i;
                                                if(((ghi-def) == (def-abc))&&((def-abc) == diff)&&(a+b+c+d+e+f+g+h+i == sum)&&(abc <= def)&&(def <= ghi) )
                                                {
                                                    int abcdefghi = a * 100000000 + b * 10000000 + c * 1000000 + d * 100000 + e * 10000 + f * 1000 + g * 100 + h * 10 + i;
                                                    container[magicCounter] = abcdefghi;
                                                    magicCounter++;
                                                }

                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (magicCounter > 0)
            {
                int[] displayNumbers = new int[magicCounter];
                for (int j = 0; j < magicCounter; j++)
                {
                    displayNumbers[j] = container[j];
                }
                Array.Sort(displayNumbers);
                for (int j = 0; j < magicCounter; j++)
                {
                    Console.WriteLine(displayNumbers[j]);
                }
            }
            else Console.WriteLine("No");
            
        }
    }

Тагове:
-6
Programming Basics 21/08/2014 10:47:19
Anonymous:
Има отворена тема за задачата: https://softuni.bg/forum/questions/details/810
Нарушена т.12 отПравилата на форума
quickben avatar quickben 966 Точки

Относно това, че не неможеш да провериш очаквания output ако свалиш задачите от ТУК вътре ще намериш всички тестове в една папка.

А за Exception-a мисля, че създаването и итерацията с няколко цикъла върху масив с 41 милиона елемента има нещо общо ( int[] container = new int[41000000];) Виж темата с видео решения на задачите от това домашно ТУК, човека ги е решил по подобен начин мисля, че ще си намериш грешката.

0
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Да, прав си, свалих елементите от масива до 410 и мина теста. Но просто не знам как да изчисля най-големия възможен брой на магически числа и затова заделих място за всички 41 милиона числа, които могат да се образуват с цифрите от 1 до 7. Просто не исках да си играя на налучкване. Благодаря за помощта.

-2
mihayloff14 avatar mihayloff14 824 Точки

Няма нужда да проверяваш и деветте числа. Забележи, че всяка следваща тройка от числа е по-голяма от предходната с точно определена стойност (diff). Затова просто може да циклиш първите три числа, а следващите се образуват с нещо от сорта:

secondSet = firstSet + diff;

thirdSet = secondSet + diff;

1
quickben avatar quickben 966 Точки

Да реално abc + difference == deff && def + difference == ghi изпълнява и другото условие ( abc<def<ghi ), но обратното не важи ;)

0
mihayloff14 avatar mihayloff14 824 Точки

@quickben не разбрах какво искаш да кажеш. Кое е обратното условие, което не изпълнява? Да не би да става въпрос за условието относно сбора на цифрите?

В този случай, това може да се изчисли (примерно) като чрез определен метод изкараш различните цифри на числата в масив и след това просто проверяваш (if array.Sum() == sum) и съответно принтираш числата.

0
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Да, с твоя подход можем да ограничим комбинациите до 343, което вече е по-нормален масив.

-1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Намерих и друг вариант. Порових из гугъл и разбрах какво представляват листовете. Това са масиви без дефиниран размер.

http://www.dotnetperls.com/list

По този начин успях да разкарам онова чудовище с 41 милиона елемента, като същевременно не ограничавам предварително броя на елементите. По-удобно са от масиви, когато не знаем предварително колко елемента ще ни трябват.

0
HPetrov avatar HPetrov 822 Точки

Използвай някакво repository където да си качваш кода и само да предоставяш линк към него. Силно ти препоръчвам PasteBin.

3
cvetant avatar cvetant 75 Точки

Ето и моето решение.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.