[C#] Operators and Expressions - 7 Задача


10

7.Write an expression that checks if given positive integer number n (n ≤ 100) is prime. E.g. 37 is prime.

 
Ето едно полурешение на задачката. Понеже за пръв път се сблъсквам с if /else ми е малко мъгла но това мисля че е почти това начина да се направи задачката. Програмката работи почти толкова добре колкото искам но не ми смята с точност деленето което присвоявам във variableResul и за това след като  в случая мине числото 19 от цикъла резултата  ми е 1.0 и ми вдига веднъж резултата  за primeRule което (не ме кефи) . Идеята  ми е  да ги сравнява и  резултата от деленето е точно 1.0 тогава да ми пипа primeRule.Отворен съм за  предложения. Приемам и други решения  на задачката но  първо бих искал да я довърша по моя си начин
 
 int myDigit = 37;
        int primeRule = 0;
        for (int i = 2; i < myDigit; i++)
        {
            double variableResult = myDigit / i;
            if (variableResult == 1.0)
            {
                primeRule++;
            }
            else;
        }
            Console.WriteLine(primeRule <= 1 ? "This number is prime" : "this number is not prime");
                //Console.Write((myDigit % i == 0 ? "This number is Prime": " ")); 
        
 
 

в C# Fundamentals от Даниел Мечкарски (0 точки)


Отговори



5

Ето тази секция може да я направиш по малко по -различен начин:

double variableResult = myDigit / i;
            if (variableResult == 1.0)
            {
                primeRule++;
            }
            else;
Просто провярявай дали даденото число се дели без остатъка на i с помощатта на %
counter = 0
if( number % i == 0 )
{
counter++
}
ако counter e > от 2 , то числото не е просто т.к. се дели на повче от 2 числа ( себе си и 1 )
 
Edit: Изпревари ме :)
 
Може да оптимизираш цикъла, като го краш да върти не до myDigit числото, а до корен квадратен на myDigit числото .
 

от Teodor92 (13062 точки)


0
я поясни малко за този корен квадратен че ми стана интересно. според мен няма да работи понеже точно като стигне до моето число минава през if-a и ми вдига брояча на 1 и така го изкарвам че е просто число. Ако брояча стига до корена той ако не е цяло число как ще го пребори не знам малко ми е тъмна Индия там

от Даниел Мечкарски (0 точки)

0
Значи, тук малко трудно ще ти го обясня, но нека пробвам: 1. Няма да има проблем с това дали числото е цяло или не, т.к. то служи само за условие, ние за друго не го ползваме. 2. Идеята с корен квадратен идва от ако дадено число не се дели на нито едно число до корен квадратен, то то е просто. Но тогава логиката на твоя код ще се промени малко. Ето малко примерен: bool isPrime = true; for(int i = 2; i <= Math.Sqrt(number); i++) { if(number%i == 0) { isPrime = false } }
И накрая вече проверяваш стойността на isPrime.

от Teodor92 (13062 точки)


2

Реших я  благодаря на всички които ми помогнаха мисловно :)  Пак съм се омотал със оператора за делене и пазене на остатъка

 

 static void Main()
    {
        int myDigit = 42;
        int primeRule = 0;
        for (int i = 2; i < myDigit; i++)
        {
            double variableResult = (myDigit % i);
            if (variableResult == 0)
            {
                primeRule++;
            }
            else;
        }
            Console.WriteLine(primeRule <= 1 ? "This number is prime" : "this number is not prime");

от Даниел Мечкарски (0 точки)


0
else; можеш да го махнеш.

от zhelyazkovn (2949 точки)

0
опитай с 4, вместо с 42, нещо primeRule <=1 не е добре

от pepoto (22 точки)


10

Това е моето решение на задачката. Не е много по различно от съветите, които са ти дали, но има някой разлики като например проврка дали числото е между 0 и 100 както е според условието

07. IsPrimeNumber


от atodorova (1273 точки)


0
Честно казано аз условието го разбирам да се провери дадено число от този интервал 0..100 дали е просто число. може английския да ми куца

от Даниел Мечкарски (0 точки)

0
Да точно това е условието и точно това проверявам в решението. Първо дали въведенто число от конзолата е по-голямо от 0 и по-малко от 100 и после на колко чила от този интервал се дели без остатък.. И в зависимост от резултата отпечатвам дали е просто или не.

от atodorova (1273 точки)


1

Идеята за корен квадратен е за да намалиш броя на итерациите, защото е достатъчно да провериш до корен квадратен от числото.

Тук пише малко повече: http://en.wikipedia.org/wiki/Prime_number (вторият абзац)

Поздрави,

Стоян


от kirov (4821 точки)


10
Колеги,
Във видеото за цикли от 2011 "06. Loops 2011" на 29:00 минута (продължава около 15 минути) има обяснение за проверка дали едно число е просто или не. Дава се отговор и на въпроса защо се използва корен квадратен.
Ето линк към видеото: http://academy.telerik.com/student-courses/archive/csharp-programming-fundamentals/video - в плей-листата търсите 06. Loops 2011 by Svetlin Nakov.
Вярвам, че това може да ви помогне да си изясните въпроса.

от radost (582 точки)


1

Едно решение и от мен:

 

static void Main()
        {
            Console.Write("Enter a positive number: ");
            int num = int.Parse(Console.ReadLine());
            if (num > 100)
            {
                Console.WriteLine("You have entered a number outside the range, please enter number less or equal to 100");
            }
            else
            {
                int divider = 2;
            int maxDivider = (int)Math.Sqrt(num);
            bool prime = true;
            while (prime && (divider <= maxDivider))
            {
                if (num % divider == 0)
                {
                    prime = false;
                }
                divider++;
            }
            Console.WriteLine("Is the number Prime? " + prime);
        }
            }

от bobibqg (390 точки)


15

Здравейте, колеги! Моето решение на задачата се свежда до следния израз:

bool isPrime = ((n % 2 != 0) && (n % 3 != 0) && (n % 5 != 0) && (n % 7 != 0));

Защото: 2, 3, 5 и 7 са всички прости числа по-малки от 10, където 10 е корен квадратен от 100. Следователно, ако число по-малко или равно на 100 не е просто, то задължително се дели на някое от тези числа (и ако не се дели на никое от тях, значи е просто).

Правилно ли разсъждавам, как мислите?

Едит: колеги, много ви благодаря за уместните забележки! Значи, ако коригирам израза, ще стане:

bool isPrime =
((n == 2) || (n == 3) || (n == 5) || (n == 7) || (n % 2 > 0)
 
&& (n % 3 > 0) && (n % 5 > 0) && (n % 7 > 0));

След като се опитах да структурирам по-добре кода, а се сетих и това, че единицата не е просто число, стана така:

bool is2357 = ((n == 2) || (n == 3) || (n == 5) || (n == 7));

bool isCoPrimeTo2357 =
     ((n > 1) && (n % 2 > 0) && (n % 3 > 0) && (n % 5 > 0) && (n % 7 > 0));
 
bool isPrime = (n > 1) && (is2357 || isCoPrimeTo2357);
 
Благодаря ви още веднъж!
 
Последно: условието n > 1 е част от условието числата да са взаимно прости (coprime) и следователно мястото му е в израза isCoPrimeTo2357.
 
Важно уточнение: числото 1 е взаимно просто с всяко друго! Сега научих това. Съжалявам за допуснатата неточност. Може би последната редакция не беше добра идея.



0
Правилно е. Това е другото решение на задачата, което е добър вариант за големи числа, като в този случай събираш в един списък всички прости числа до корен квадратен на числото, което проверяваме, след което проверяваш дали се дели на списъка без остатък.

от kdikov (3407 точки)

0
Колега Лаков!+1 от мен за така зададена задачата и за толкова малко ограничение до 100 решението не е никак лошо.Ако броим if-условията които се проверяват в твоето решение са в най-лошият вариант 4,докатокато условието,което се проверява в един цикъл е със същата тежест за ресурса,но като брой пъти задължително е доста повече.Друг е въпросът,че за по-големи числа не знам колко е удачно да се използва този вазриант.Единствена препоръка-за по-добро структуриране на кода бих декларирал две допълнителни променливи,едната да съдържа резултата от първите два израза,другата от вторите два.

от RumenTonev (336 точки)



2
Ето и моето решение :)
Може да се въведе всяко число от нула до колкото позволява int и като бонус , ако числото не е просто, казва кои са му divider-ите :)

//Show dividers of number
using System;
class PrimeNumber { static void Main() { Console.WriteLine("Еnter positive integer number:"); int num = int.Parse(Console.ReadLine()); int divider = 1; int check ;
while (divider < Math.Sqrt(num)) { divider ++; check = num % divider; if (check == 0) { Console.WriteLine("Divider {0}",divider); }
} Console.WriteLine("DIDN'T SEE DIVIDER? YOUR NUMBER IS PRIME."); } }

от el_b_k (424 точки)


0
Благодаря за примера, от всичко прочетено, тази задача - само по този начин я схванах !


0
Радвам се , че съм била от полза :)

от el_b_k (424 точки)



1

 

Ето още едно решение без ограничение до 100:
 
using System;
 
class CheckIfNumberIsPrime
{
    static void Main()
    {
        Console.Write("Please enter an integer number: ");
        int num = int.Parse(Console.ReadLine());
        int sqrt = (int)Math.Sqrt(num);
        int i = 2;
        bool prime = true;
        while (prime && i <= sqrt)
        {
            if (num % i == 0)
            {
                prime = false;
            }
            i++;
        }
        if (!prime)
        {
            Console.WriteLine("The number is composite!");
        }
        if (prime)
        {
            Console.WriteLine("The number is prime!");
        }
    }
}
За числата до 100 е най-кратко, като че ли без цикъл, да се направи проверка за деление без остатък на 2, 3, 5 и 7.

от shristoff (747 точки)


0
Колега, алгоритъмът ти не е правилен. Цикълът ти ще прекъсне още след първата проверка. Не даваш възможност на брояча "i" да провери всички стойности по-малки от корен квадрата от "num". Може би трябва да добавиш една проверка в else блока дали броячът е стигнал до края и тогава няма да има смисъл и от break. else { if (i == Math.Sqrt(num)) { Console.WriteLine("The number is prime"); } }

от alphavillee (195 точки)

0
Да, доста очевидна беше грешката, но съм я пропуснал :( Благодаря ти че ми я показа! С тази проверка, която предлагаш също не става, защото при просто число няма да напише нищо. Направих го по-различно - добавих булева променлива, в която да пазя резултата от проверката дали се дели без остатък и изкарах печатането на резултата извън цикъла.

от shristoff (747 точки)



1

Както колегата е Теодор посочил, можеш да правиш проверка до корен квадратен от числото. Има още две неща, които лесно можеш да промениш зa да оптимизираш:

  1. Първо правиш проверка дали числото е четно -                                 if(number % 2 == 0) { return number == 2 }
  2. Започваш от  3  и променяш стъпката на итерацията - вместо divider++, ползваш divider += 2. Така проверяваш само нечетните.

Ето моето решение http://pastebin.com/E1bTS8vd


от Stefanpu (404 точки)


1
Моето решение, което и аз реших да споделя. Би трябвало да работи в положителната част на нормалния инт, или поне така си мисля.
using System;
class PrimeNumber { static void Main() { Console.WriteLine("Input a number"); int number = int.Parse(Console.ReadLine()); for (int i = 2; i < number; i++) { if (number % i == 0) { Console.WriteLine("Your number is not prime"); return; } } Console.WriteLine("Your number is prime"); } }

от Nedko (1220 точки)


0
Тука с уговорката, че не съм написал проверката за 0 и 1, защото те не се водят за прости числа.

от Nedko (1220 точки)