Loading...
Atanasov_88 avatar Atanasov_88 39 Точки

Problem 8. Prime Number Check

Колеги, моля за помощ, съдействие, обяснение или още нещо...Знам, че сигурно тази задача е елементарна за голяма част от форума, но просто не мога да се справя. Къде бъркам. След проверките съм сигурен, че трябва да използвам оператора && в този случай, защото и двете проверки трябва да са верни. Но ми изкарва всичко true...

 

using System;

class DividedBySevenandFive
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());

        bool primeNumber = (n / n == 1 && n / 1 == n);

        Console.WriteLine(primeNumber ? true : false);
    }
}

Тагове:
2
Programming Basics
vmkoleva avatar vmkoleva 12 Точки
Best Answer

Аз така го реших, пак е с цикъл, но тъй като още не съм се запознала с for, го направих по по-лесния (според мен) начин. Погледни, дано ти е станало ясно и съм била полезна :) 


            Console.WriteLine("Write your number.");
            int num = int.Parse(Console.ReadLine());
            int divider = 2; 
            int maxDivider = (int)Math.Sqrt(num); //с корен квадратен съкращаваш цикъла;
            bool prime = true;
            while (prime && (divider <= maxDivider)) //с while проверяваш дали числото се дели на нещо от 2 до корена му;
            {
                if (num%divider ==0) //ако числото ти се дели на някои от тези делителите без остатък, то цикъла ти прекъсва и ти дава false;
                {
                    prime = false;
                }

                divider++;
            }
            Console.WriteLine(prime); //ако не се дели на нито едно от числата, то числото е просто;

0
12/06/2015 20:22:00
Filkolev avatar Filkolev 4482 Точки

n/n == 1

Замести n с произволни числа: 2/2 == 1 (true), 5/5 == 1 (true), 123456/123456 == 1 (true). Този израз е винаги верен, каквото и число да подадеш.

n/1 == n

2/1 == 2 (true), 5/1 == 5 (true), 123456/1 == 123456 (true). Това също е винаги вярно.

Де факто твоята проверка е true && true, което винаги е true като резултат.

Разгледай в нета алгоритми за проверка на просто число. Не е толкова елементарно като една булева проверка.

2
RoYaL avatar RoYaL Trainer 6849 Точки

Ъъъ.. Не бъркаш програмистки, а логически...

Кажи ми, кое число разделено на себе си дава различно от 1 и кое число разделено на 1, дава различно от себе си? Помагам - няма такова. Т.е. нормално е за всички входове да получиш TRUE. Защото всяко число разделено на себе си ще даде ЕДНО и всяко число разелено на ЕДНО ще даде себе си.

Прости числа са обаче тези числа, които могат САМО това. Т.е. не могат да се разделят на никое друго число без остатък.

2
Zakkgard avatar Zakkgard 39 Точки

Здравей,

Тук ти проверяваш дали числото се дели на себе си и 1, което е вярно за всяко цяло число. Просто е числото което се дели само на себе си и едно. По пътя на логиката, би трябвало ако имаш числото 7, да провериш дали се дели на 2, 3, 4, 5 и 6. Възможно е да се скъси процерата като проверяваш от 2 до корен от n:

 

using System;

class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        bool isPrime = true;

        for (int i = 2; i < Math.Ceiling(Math.Sqrt(n)); i++)
        {
            if (n % i == 0)
            {
                isPrime = false;
                break;
            }
        }

        Console.WriteLine(isPrime);
    }
}

3
Atanasov_88 avatar Atanasov_88 39 Точки

Благодаря за инфото, надявам се по-бързо да вземем if, else и for, за да станат ясни нещата :) Поздрави.

2
stefkay avatar stefkay 54 Точки

Ако едно число не може да се раздели на което и да е просто число от 2 до корен квадратен от числото, то то е просто. 

В нашия случай, тъй като имаме ограничение до 100, може да я решиш и без цикъл, но трябва да провериш дали подадената ти стойност се дели без остатък на първите прости числа - 2, 3, 5 и 7 (следващото е 11 и е по-голямо от кв. корен на 100) . Трябва да провериш и дали въведената стойност е равна на 2, 3, 5 или 7, както и дали числото е > 1.  Успех!

1
S.Iliev avatar S.Iliev 47 Точки

Колеги имам нужа от помощ и насоки.

Написах това като решение на осма задача, работи, но не ми харесва. Мъчих се само с тернарен оператор да я реша, но не успявам. Някакви насоки?

http://pastebin.com/CRgqAvxk

using System;

class PrimeNumberCheck
    {
        static void Main()
        {
            int inputNumber = int.Parse(Console.ReadLine());
            if (inputNumber == 1)
            {
                Console.WriteLine("false");
            }
            else if (inputNumber == 2 || inputNumber == 3)
            {
                Console.WriteLine("true");
            }
            else
            {
                Console.WriteLine(inputNumber%2 == 1 &amp;amp;&amp;amp; inputNumber%3 == 1 ? "true" : "false");
            }
        }
    }

 

0
26/06/2015 11:07:25
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Светославе,

трябват ти много делители един след друг, не 2, не 2 и 3....

тук пише колко и кои делители ти трябват само за числата до 100...

https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

А този код използва точно алгоритъма на Ератостен:

http://codereview.stackexchange.com/questions/62139/sieve-of-eratosthenes-implementation-is-running-slowly

маха всички числа, които са кратни на две, после с два вложени цикъла

for(int x = 2; x &amp;amp;lt; 10000;x++)
        {
            for(int y = x * 2;y &amp;amp;lt; 10000;y = y + x)

y = x * 2 ...стъпка y = y + x (така получаваш всички числа кратни на X, и ги махаш - за кратните на 2, 3, ..... до колкото искаш. И които останат не махнати са прости числа (prime numbers).

0
26/06/2015 12:55:49
S.Iliev avatar S.Iliev 47 Точки

Тоест без For-цикъл няма вариант за решение?

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Ами трябват ти дълъг списък от делители, ако не искаш да използваш for цикъл, можеш да вземеш от wikipedia лик-а всички делители и да разделиш на всеки от тях, но е неприятно - няма смисъл - for цикъла е много удобен тук.

Тернарен оператор до 100: Console.WriteLine(inputNumber % 2 == 0 && inputNumber % 3 == 0 && inputNumber % 5 == 0 && inputNumber % 7 == 0 ? "false" : "true"); (заменя твоя ред в else{ }

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