Loading...
kirildodov avatar kirildodov 0 Точки

Nested Loops More Exercises - Exercise

Здравейте!

Задача 06. Prime Pairs ме затрудни. Въпреки че при въвеждането на примернитр входове ми излиза верен изход не разбирам защо в Judge ми дава едва 20/100. На всичкото отгоре ми изписва Zero test #2 (Incorrect answer)! Това е решението ми: Solution #10758290

 

using System;

namespace _06._Prime_Pairs
{
    class Program
    {
        static void Main(string[] args)
        {
            int firstPairStart = int.Parse(Console.ReadLine());
            int secondPairStart = int.Parse(Console.ReadLine());
            int firstDiff = int.Parse(Console.ReadLine());
            int secondDiff = int.Parse(Console.ReadLine());

            int firstDigitStart = firstPairStart / 10;
            int firstDigitEnd = (firstPairStart + firstDiff) / 10;

            int secondDigitStart = (firstPairStart) % 10;
            int secondDigitEnd = (firstPairStart + firstDiff) % 10;

            int thirdDigitStart = secondPairStart / 10;
            int thirdDigitEnd = (secondPairStart + secondDiff) / 10;

            int fourthDigitStart = (secondPairStart) % 10;
            int fourthDigitEnd = (secondPairStart + secondDiff) % 10;

            //Console.WriteLine(firstDigitStart);
            //Console.WriteLine(firstDigitEnd);
            //Console.WriteLine(secondDigitStart);
            //Console.WriteLine(secondDigitEnd);
            //Console.WriteLine(thirdDigitStart);
            //Console.WriteLine(thirdDigitEnd);
            //Console.WriteLine(fourthDigitStart);
            //Console.WriteLine(fourthDigitEnd);

            for (int d1 = firstDigitStart; d1 <= firstDigitEnd; d1++)
            {
                for (int d2 = secondDigitStart; d2 <= secondDigitEnd; d2++)
                {
                    for (int d3 = thirdDigitStart; d3 <= thirdDigitEnd; d3++)
                    {
                        for (int d4 = fourthDigitStart; d4 <= fourthDigitEnd; d4++)
                        {
                            int firstPair = d1 * 10 + d2;
                            int secondPair = d3 * 10 + d4;
                            bool firstIsPrime = true;
                            bool secondIsPrime = true;
                            for (int i = 2; i < firstPair; i++)
                            {
                                if (firstPair % i == 0)
                                {
                                    firstIsPrime = false;
                                    break;
                                }
                            }
                            for (int i = 2; i < secondPair; i++)
                            {
                                if (secondPair % i == 0)
                                {
                                    secondIsPrime = false;
                                    break;
                                }
                            }
                            if (firstIsPrime && secondIsPrime)
                            {
                                Console.WriteLine($"{d1}{d2}{d3}{d4}");
                            }
                        }
                    }
                }
            }
        }

    }
}
 

Тагове:
0
Programming Basics
Iv_Konov avatar Iv_Konov 383 Точки
Best Answer

Добро утро, Кирил,

 

Смятам, че повече полза ще имаш, ако то обясня различен подход за решаване и детайли на моите разсъждения (някой може да има по-добри идеи). Разделянето на четири цифри - не ми се струва оптимално.

 

Създай два for цикъла за двете двойки:

===========================

            int firstPairStart  = int.Parse(Console.ReadLine());
            int secondPairStart  = int.Parse(Console.ReadLine());
            int firstDiff  = int.Parse(Console.ReadLine());
            int secondDiff  = int.Parse(Console.ReadLine());

            int pair1Ctr = 0;
            int pair2Ctr = 0;

            for (int pair1 = firstPairStart ; pair1 <= firstPairStart  + firstDiff ; pair1++)
            {
                for (int pair2 = secondPairStart ; pair2 <= secondPairStart  + secondDiff ; pair2++)
                {

=================================

 

Преди да продължиш с по-долните проверки добави временно (после го премахни):

Console.Write($"{pair1}{pair2} ");

и пробвай първи примерен вход дали виждаш всички числа, които ще обработваш (съгласно обясненията)! Да бъдеш сигурен, че циклите работят коректно...

10

20

5

5

1020 1021 1022 1023 1024 1025 1120 1121 1122 1123 1124 1125 ...  1320 1321 1322 1323 1324 1325 1420 1421 1422 1423 1424 1425 1520 1521 1522 1523 1524 1525

Добави във вътрешния цикъл проверка за прости числа за двете двойки (прилагам само за първата двойка):

================================

for (int i = 2; i <= Math.Sqrt(pair1); i++) // проверка до корен квадратен е достатъчно!
                    {
                        if (pair1 % i == 0)
                        {
                            pair1Ctr++;
                            break; // за да не се губи време
                        }
                    }

================================

 

Печаташ и инициализираш броячите:

===============================

if (pair1Ctr == 0 && pair2Ctr == 0)
                    {
                        Console.WriteLine($"{pair1}{pair2}");
                    }

                    pair1Ctr = 0;
                    pair2Ctr = 0;

===============================

 

Поздрави,

Иван :)

 

0
28/03/2019 11:04:33
kirildodov avatar kirildodov 0 Точки

Благодаря ти!

Доста по опростено от моето решение! Сега ще го тествам.

0
Iv_Konov avatar Iv_Konov 383 Точки

п.с. и още една  идея за решение...

===================================

 if (pair1 % 2 != 0 && pair1 % 3 != 0 && pair1 % 5 != 0 && pair1 % 7 != 0 && pair2 % 2 != 0 && pair2 % 3 != 0 && pair2 % 5 != 0 && pair2 % 7 != 0)
                    {
                        Console.WriteLine($"{pair1}{pair2}");
                    }

===================================

 

Проверките за просто число ги опростявам. Двойките са ограничени от условието до 90, и няма смисъл от циклите за проверка дали двойките са прости числа.

 

Поздрави,

Иван

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