Професионална програма
Loading...
+ Нов въпрос
i.minchev.qa avatar i.minchev.qa 34 Точки

Master Numbers - решения?

Ето го моето работещо решение на тази задача - http://pastebin.com/QXw3GCvD.

Дава 100 точки в judge, но е наръба да прехвърли границата - Memory: 16.00 MB .

Даже преди да го поредактирам ми даде 75/100 и един силво като floppy disk понеже Memory: 16.02 MB 

Някой има ли по-опростено решение?

Тагове:
2
Programming Basics
IskrenPenev avatar IskrenPenev 177 Точки

Разгледай моето:

http://pastebin.com/9223AShk

Минава тестовете за 0.31sec  и използва около 12MB.

Колкото до твоя код - паметта която ползва е на границата, защото позлваш списък да съхраниш всяко от валидните числа.

0
24/05/2016 11:00:05
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Методът ти isPalindrome() не работи коректно. Използваш тип int, който е с обхват [–2,147,483,648 до 2,147,483,647]. Твоят метод връща false за всяко число с 8 или повече цифри, а в обхвата на int има доста такива, които са palindromes. Ако в Judge имаше тест с число от типа на 12344321 или 100010001, твоят метод дава false, а трябва да бъде true. По-добър вариант ще е да обходиш стринга с цикъл. Така каквато и дължина да има, винаги ще се проверят всички цифри.

PS: Казвам ти това с идеята, че съм полезен в някаква степен - не ми е целта да се заяждам с чужди решения :)

0
IskrenPenev avatar IskrenPenev 177 Точки

Съгласен съм, но съм ползвал int само и единствено, понеже такива са ограниченията. 

0
i.minchev.qa avatar i.minchev.qa 34 Точки

1. Относно: If проверките на броя на цифрите при метода за откриване на палиндром.

Може да отпаднат if проверките за дължината на числата ако с метод от вида:

 static bool isPalindrome(int number)
        {
            bool isPalindrome = false;
            string strNumber = number.ToString();            
            int cntEqualPairs = 0;
            
            for (int iPal = 0; iPal < strNumber.Length / 2; iPal++)
            {
                if (strNumber[iPal] == strNumber[strNumber.Length - 1 - iPal])
                {
                    cntEqualPairs += 1;
                }
            }
            if (cntEqualPairs == strNumber.Length / 2)
            {
                isPalindrome = true;
            }
            else if (cntEqualPairs != strNumber.Length / 2)
            {
                isPalindrome = false;
            }
            return isPalindrome;
        }

Така цифрите на числото в обхвата на int множеството ще бъдат обходени без значение колко точно са на брой.

2. Итераторът 'i' в Main метода може да стартира от числото 7 и да има вида -  for (int i = 7; i < n; i++)     

Причина: Второто подусловие на задачата е сумата от цифрите на числото да е == 7;

                  Числата под 7 (напр. числото 6) не се делят на 7 без остатък => итераторът i може да стартира направо от 7;

Инак ми хареса по лекия код на колегата Iskren Penev.

:)

0
24/05/2016 12:30:35
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Ето и моето решение, което е доста по-кратко.

http://pastebin.com/x3VqrEdj

 

Пояснение: Правя 2 метода, които връщат bool резултат. Първият проверява дали числото е "palindrome" и дава true или false. Вторият сумира отделните цифри на числото, като същевременно проверява дали някоя от тях е четна и ако сумата се дели на 7 и има четна цифра, връща true. После с тези два метода си проверяваме всичко. Разделил съм ги така, защото първият използва числото, въведено като string, а втория - като int.

0
24/05/2016 22:53:37
r3v3nan7 avatar r3v3nan7 365 Точки

Заповядай и моето решение :) 

https://github.com/pkindalov/Data-Types-and-Methods/blob/master/MasterNumbers/MasterNumbers.cs

0
i.minchev.qa avatar i.minchev.qa 34 Точки

Много ми хареса как сплитваш int с :   string digits = "" + num;

Така се спестява моето тромаво и сложно char[] currNumbDigits = (currentNumber.ToString()).ToCharArray(); 

Благодаря :) .

1
r3v3nan7 avatar r3v3nan7 365 Точки

Радвам се, че ти е помогнало с нещо решението. Пък и нали за това сме тук. Да се учим един от друг и да си помагаме :)

0
borislav9212 avatar borislav9212 746 Точки

Здравейте.

Ето и от мен едно решение 100/100 Memory: 11.86 MB - Time: 0.015 s http://pastebin.com/UqWkDVYN

Всеки път дава различни стойности, сега ми даде и Memory: 8.39 MB - Time: 0.015 s; Memory: 11.82 MB
Time: 0.031 s

0
24/05/2016 12:22:27
ralitsa_d avatar ralitsa_d 171 Точки

Ето едно решение и от мен. Използвам отделен bool метод за всяко условие. Проверките ги правя във вложени if-ове, защото така ми е по-лесно да дебъгвам. Не е проблем да се изпишат на един ред с оператор &&. Използвана памет - 11.86 МB.

0
stanislav_vv avatar stanislav_vv 2 Точки

Здравейте, ето и от мен едно решение. В judge-a ми излиза Memory: 8.05 MB
Time: 0.015 s :

http://pastebin.com/ekg1y0m5

Няма да крия, че доста изчетох на колегите решенията докато си го нагодя да ми е най-лесно за разбиране :)

0
DeyanPeychev avatar DeyanPeychev 20 Точки

Здравейте и от мен,
Това е моето решение, което ми дава 75/100, понеже прехвърля позволената памет на последния тест. Ако някой може да ми помогне да се насоча към грешките си ще бъда благодарен. :) 

http://pastebin.com/KEGurU1r

Според мен проблемът идва от методът IsPalindrome() заради функцията, която reverse-ва стринга, но все пак искам да чуя и вашите мнения, защото не съм на 100% сигурен, а до колкото го тествах си работи и така. :) 

0
07/01/2017 01:21:01
ThePSXHive avatar ThePSXHive 436 Точки

При подходът със string се създават доста копия на системния стек, а и вложената в задачата гранична стойност за паметта е ниска. Ако използваш допълнителни променливи (например, "флагчета") то тогава ще бъдеш малко под границата с едно разумно решение. В случая, по-добре е да се премине директно към проверката. Ако value ти е входната стойност, a revVal ти е променливата в проверката, то ф-та ще изглежда така:

while (value > 0)
{
    revVal = revVal * 10 + value % 10; 
    value /= 10; 
}

Това е една от функциите без използване на допълнителна променлива

static bool containsEvenDigit(int value)
{
    while (value > 0)
    {
        if ((value % 10) % 2 == 0) return true;  
	    value /= 10; 
    }
		
    return false; 
}

Последно, в условието на задачата, проверката се осъществява в интервала [1...n]. Judge-а ще ти даде задоволителен резултат и при начална стойност 7, но инструкциите все пак са си инструкции, за да бъдат спазвани.

 

P.S. Използвана памет: 8.04 MB

0
07/01/2017 11:08:56
vanmx avatar vanmx 4 Точки

Здравейте. Аз имам проблем с моето решение. Judge ми дава един грешен резултат и  прекалено много памет.

http://pastebin.com/8q5wEQXw

За грешния резултат допускам, че проблемът ми е в IsPalndrome(). Ако кодът ми е неразбираем, нека да обясня каква ми е идеята:

- Вземам от числото първата половина от цифрите чрез string.Substring(0, n)

- След това вземам втората половина чрез модулно деление на 1, 10,100 и т.н, толкова нули колкото е броя цифри в числото разделен на 2. Ако са нечетен брой има една нула по-малко, защото нали остава една цифра по среда.

- накрая завъртам втората половина на обратно и я сравнявам с първата.

Сега виждам, че някой колеги са го направили по доста по-кратък начин, на ми е интересно зашо моя не работи.

А пък с превишената памет съм направо шах и мат :)

0
krasi1105 avatar krasi1105 380 Точки

Както предположи, проблемът е в IsPalindrome(). 7007 е първата грешка, връща false вместо true.

За паметта- не е нужно да се използват стрингове за решението на задачата, навсякъде могат да бъдат заменение с цели числа. Решение с 8MB

0
25/01/2017 15:19:42
Ani.Savova avatar Ani.Savova 16 Точки

Здравейте, джъдж ми дава 50% 3ти и 4ти тест гърмят, но не мога да си намеря грешката. https://pastebin.com/jaXqjrJQ

 

0
k.sevov avatar k.sevov 1073 Точки

Грешката е в IsPalindrome метода - връща ти true при само една двойка равни символи, вместо да проверява за всички (едно съвпадение е достатъчно, за да ти промени булевата променлива на true). 

1
IliyanTodorov avatar IliyanTodorov 20 Точки

Eто едно по-леко решение заема само 7.55MB 

https://pastebin.com/QTcJcR76

0