Loading...
remote87 avatar remote87 121 Точки

[HOMEWORK] Math For Developers - Problem 1 SomePrimes

Някой може ли да ми каже, къде бъркам:

using System;

class SomePrimes
{
    static void Main()
    {
        Console.WriteLine("Enter a number to check if it's prime:");
        int prime = int.Parse(Console.ReadLine());
        if (prime <= 1)
        {
            Console.WriteLine("Your number is NOT prime.");
        }
        else if (prime == 2)
        {
            Console.WriteLine("Your number is prime.");
        }
        else if (prime % 2 == 0)
        {
            Console.WriteLine("Your number is NOT prime.");
        }
        for (int i = 2; i <= prime - 1; i++)
        {
            if (prime % i == 0)
                {
                    Console.WriteLine("Your number is NOT prime.");
                }
            else
            {
                Console.WriteLine("Your number is prime.");
            }
        }
    }
}

Правя проверка за 3, 5 и 7 и всичко е ок. Правя проверка за 4 и накрая ми излиза, че е просто число, а като си гледам кода не би трябвало...уж. ?!

0
Programming Basics
djc_bg2015 avatar djc_bg2015 923 Точки

Здравей,

ето какво коригирах по кода ти:

1.  for цикъла го вкарах в else

2. Вътре в цикъла го направих да работи с булева променлива и да печата само веднъж, когато е приключило с проверките.

 

Ето кода:

https://gist.github.com/vdonchev/baca2338a6ca43256954

 

Пс. Не съм тествал задълбочено дали работи правилно, но на пръв поглед изглежда ОК.

 

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

 

            bool isPrime = true;
            for (int i = 2; i < Math.Sqrt(prime); i++)
            {
                if (prime % i == 0)
                {
                    isPrime = false;
                }
            }

 

Можеш да тестваш с максималната стойност на инт 2147483647 (просто число). Ще видиш че, ако изполваш math.sqrt, ще стане с пъти по - бързо.

1
13/08/2015 13:08:32
remote87 avatar remote87 121 Точки

Здравей!

Много благодаря за помощта, знам от лекцията, че е по-добре / по-бързо е / да се ползва Math.Sqrt, но исках да го направя по този начин, просто за да го проследя, как работи / нещо като упражнение / и да си го изясня и кат код, не само като примера от слайда. Иначе с корен квадратен го подкарах и си работи супер! :)

Още веднъж благодаря за корекциите :)

П.С. Уха, пробвах го с макс int - чак се зачудих дали не се счупи нещо :D 

Определено ще си го правя с Math.Sqrt :)

1
13/08/2015 13:13:14
remote87 avatar remote87 121 Точки

Такаа, малко промених първоначалния код според условието на задачата - да намерим, кои прости числа са на 24, 101 и 251 позиция и стигнах до момента, в който потребителя въвежда, кой ред да се провери и да се отпечата простото число на него, само че нещо се пооплетох / както се очакваше / :

using System;
using System.Collections.Generic;

class SomePrimesRange
{
    static void Main()
    {

        for (int i = 2; i < 260; i++)
        {
            if (i % 2 == 0)
            {

            }
            else if (i % i == 0)
            {
                Console.WriteLine(i);
            }
            List<int> numbers = new List<int>(260);
            numbers.Add(i);
            foreach (int a in numbers)
            {
                Console.WriteLine("Enter a position:");
                int position = int.Parse(Console.ReadLine());
                Console.WriteLine(position);
            }
        }
    }
}

Не съм много сигурен дали това е правилния начин да се направи, но пък съм сигурен, че List-а ми не е където трябва. Някакви идеи? Моля те, не искам готов код, ако е възможно, а само насоки или идеи и да се помъча аз малко. После ще кача да видиш, какво съм написал :)

0
16/08/2015 19:59:28
butanfire avatar butanfire 32 Точки

Привет man,

Странно е че :

1) Си декларирал списъка в цикъла

2) Проверката за Prime само това ли е :

 if (i % 2 == 0)
            {

            }
            else if (i % i == 0)
            {

3) Това немога да го разбера :

  foreach (int a in numbers)
            {
                Console.WriteLine("Enter a position:");
                int position = int.Parse(Console.ReadLine());
                Console.WriteLine(position);

Пишеш позицията на всяко число ли? :)

 

Препоръки :

1) Направи си един array , like this :

int[] Test = new int[100]; //примерно

Може би, защото на мен ми е по-лесно с масив, отколкото списък.

2) Виж си правилно алгоритъма за проверка на Prime Number, че засега май само 1/4 проверяваш. :)

3) Тествай и debug-вай докато не заработи :)

Debug-a може да ти помогне с алгоритъма, като видиш какво реално прави програмата ти.

=> Приема ли стойностите както очакваш, прави ли стъпките в цикъла както се очаква и т.н. т.н.

Успех!

 

Поздрави,

Владо

1
remote87 avatar remote87 121 Точки

Здравей, Владо!

Извинявай, втория код който съм постнал е тотаааална боза, както си забелязал. Нещо не знам защо, но като го писах изобщо не съм гледал / нито пък мислил /. Идеята за масива никак не е лоша, но просто първоначално ми тръгна с идеята за лист. Ако искаш виж вариантите на RoYaL - доста са добри.

Благодаря за съветите и за новия начин, по който смятам да пробвам днес :)

0
djc_bg2015 avatar djc_bg2015 923 Точки

Здравей

В случая нещата са по - сложни. Ще трябва да завъртиш цикъл до някое мн голямо число, тъй като няма как да знаеш например 789-то  просто число в какъв диапазон е.

 

ЕДИТ: Сега видях, че колегата е отговорил по - подробно и по - правилно :). while докато броя на елементите в листа не станат равни на търсения брой :)

 

Аз бих го направил с лист от инт (не слагай декларацията на листа вътре в цикъл). ще слагам всяко намерено просто число в лист и след това ще проверявам, дали броя на елементите в листа е равен на позицията, която се търси. Ако е равен, брейквам от цикъла и принтирам елемента от листа list[pos].

Успех!

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