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 328 Точки

Методът ти 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 328 Точки

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

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 745 Точки

Здравейте.

Ето и от мен едно решение 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 5 Точки

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

http://pastebin.com/ekg1y0m5

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

0
DeyanPeychev avatar DeyanPeychev 21 Точки

Здравейте и от мен,
Това е моето решение, което ми дава 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 1077 Точки

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

1
IliyanTodorov avatar IliyanTodorov 20 Точки

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

https://pastebin.com/QTcJcR76

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