[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 точки)


1
static void Main() { Console.Write("Enter an integer number "); int inputNumber = int.Parse(Console.ReadLine()); bool isPrime = false;
if (inputNumber > 2 && inputNumber % 2 != 0) { int inputNumberSqrt = (int)Math.Sqrt(inputNumber); for (int i = 3; i <= inputNumberSqrt; i++) { isPrime = inputNumber % i != 0; if (!isPrime) break; } } if (inputNumber == 2) isPrime = true; Console.WriteLine(inputNumber + " is prime number: " + isPrime); }

от kdikov (3407 точки)


1

 

http://pastebin.com/wcvZwq5N
 
Тази задача доста ме затрудни, въпреки че изглежда лесна. Наложи се да си "открадна" идеята..
 

от plamen.yovchev (3283 точки)


0
няма програмист който да не го прави

от saykor (8845 точки)

0
И на мен ми се наложи да я "открадна" от теб, но ми допадна най - много .

от Baltiyski (49 точки)


0

Доразвих решението си, като в основата на новото ми решени използвам това, че число е просто ако не се дели на простите числа до корен квадратен на търсеното число.

Записвам файл с намерените до момента прости числа, като за проверките използвам събраната информация от предишни пускания на програмата. Ако се търси число, което е по-голямо от последното във файла, новите прости числа се добавят към файла.

Имам обаче няколко проблема, с които не мога да се справя...Тъй като използвам List, в който записвам  известните до момента (и новите) прости числа, това ме ограничава от към броя на възможните индекси – Int32.

Стойностите в List-а са ми long, но при изпълнение на програмата, ако стойностите минат Int32.MaxValue (но все още в допустимите стойности на индекса от List-a), се появява едно зацикляне, неразгадаемо за мен.

Ще се радвам на съвети относно решаването на тези 2 проблема.

http://pastebin.com/hM6MHE9c

 


от kdikov (3407 точки)


0
Ето и моето просто решение с 2 вложени цикли като вторият върти до корен квадратен от числото в първия.
using System;
class PrimeNumber { static void Main() { for (int isPrimeNumber = 2; isPrimeNumber <= 100; isPrimeNumber++) { bool pRule = true; for (int i = 2; i < Math.Sqrt(isPrimeNumber); i++) { if (isPrimeNumber % i == 0) { pRule = false; break; } } if (pRule) { Console.WriteLine(isPrimeNumber.ToString()); } } } }



0
Условието на задачата е да се проверява дали дадено число е просто, а не да се извеждат всички прости числа. Гледай да избягваш използването на методи като Sqrt и Pow в цикли. Много са бавни. А камо ли като ги викаш повече от 10 пъти :D

от VGeorgiev (2890 точки)

0
Опс, заиграх се с 1 - 100 имаше и някъде такава задача... Пращам решението с проверка само за 1 число между 2 и 100
using System;
class PrimeNumber { static void Main() { // for (int isPrimeNumber = 2; isPrimeNumber <= 100; isPrimeNumber++) int isPrimeNumber = int.Parse(Console.ReadLine()); if (isPrimeNumber > 1 && isPrimeNumber <= 100) { bool pRule = true; for (int i = 2; i <= Math.Sqrt(isPrimeNumber); i++) { if (isPrimeNumber % i == 0) { pRule = false; } }
if (pRule) { Console.WriteLine(); Console.Write(isPrimeNumber.ToString() + " is a prime number"); Console.WriteLine(); } else { Console.WriteLine("Not a prime number"); } } else { Console.WriteLine("Only number between 2 and 100"); } } }



0
Ето моето решение http://pastebin.com/yJKA7vqX
Имам една молба, някой да помогне как да избегна гадната проверка за това дали въведеното число е 2 или 3 иначе програмката работи и за по-големи числа.

от makmidov (598 точки)


0

Ето и моето решение. Ако въведеното число няма делители в интервала от 2 до корена от въведеното число включително, то то е просто.

http://pastebin.com/0RU0jQZ7




0
Очевидно или-то трябва да е || и ако for цикъла се стартира веднъж за въведена стойност 2 ще даде резултат, че 2 не е просто.

от makmidov (598 точки)

0
За или-то си напълно прав, че е ||, интересното е, че и така работи и не ми дава грешка. Иначе програмата, така, както е написана, дава, че 2 е просто.



0

Много ми допадат решенията с цикли и проверки (if - else) но ме вдъхнови коментара на Радослав Лаков и реших да упражня малко "и", "или" и "ала-бала" :) та се получи това:

using System;
class PrimeNumber
{
   static void Main()
   {
        Console.WriteLine("Enter an integer <=100: ");
       int prime = int.Parse (Console.ReadLine());
       bool isPrime = ((prime % 2 != 0) && (prime % 3 != 0) && (prime % 5 != 0) && (prime % 7 != 0) && (prime!=1 ));
       bool isCoPrime2357 = ((prime == 2) || (prime == 3) || (prime == 5) || (prime == 7));
       Console.WriteLine((isPrime || isCoPrime2357 == true)? "number is PRIME": "number is NOT PRIME");
    }
}


от ludmil.d (490 точки)


0

http://pastebin.com/CJK06Wqk

Да споделя и аз моето решение...Използвал съм byte вместо int, и не съм използвал формули, за да може да е възможно най-бърза за изпълнение...Съшо така съм направил и проверка дали въведеното число е <100 и е положително.


от zhelyazkovn (2949 точки)


0
class IsNumberPrime { static void Main(string[] args) { int Prime = 37; int check = 0; for (int i = 2; i <= Prime; i++) { if (Prime % i == 0) { check++; } } if (check==1) { Console.WriteLine("The number is Prime"); } else Console.WriteLine("the number is not Prime"); } }


това как ви се струва малко е левашко ама така мога

от harpun (40 точки)


0
Много по-добре би било не да броиш колко пъти се дели prime на i без остатък, а въобще дали се дели на някакво i без остатък и ако намериш такова да брейкнеш цикъла. Тоест е по-удачно да използваш булева променлива и да проверява за един делител в интервала от две до съответното число (без да го включваш). Като при решението описано от мен може дори да го оптимизираш като намалиш интервала до корен квадратен от съответното число. :)

от westi3m (5621 точки)


2
Колеги, така дали е добре, стараех се да сведа броя на операциите до минимум B)


Console.WriteLine("\n\nChecks if a number is prime or composite.\n==============================\n"); while (true) { byte inputNumber; bool isPrime = false;
while (true) { Console.WriteLine("\nEnter number: "); inputNumber = byte.Parse(Console.ReadLine());
if (inputNumber > 100) { Console.WriteLine("\nPlease only enter numbers from 0 to 100."); } else { break; } } while (!isPrime) { if (inputNumber == 0 || inputNumber == 2 || inputNumber == 1 || inputNumber == 3) { isPrime = true; break; } else { if (inputNumber % 2 != 0) { bool done = false; byte loops = (byte)(Math.Sqrt(inputNumber)); for (int divider = 3; divider < loops; divider += 2) { if (inputNumber % divider == 0) { done = true; break; } } if (done) { break; } isPrime = true; } else { break; } } } } Console.WriteLine("Is {0} prime: {1}", inputNumber, isPrime);

от KOCTEHYPKATA (5259 точки)


0
Много дълго решение иначе ок :)