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
RoYaL avatar RoYaL Trainer 6849 Точки
Best Answer

В кода, който поседно си постнал все още не проверяваш правилно за Prime number.

Използвай това, което е казал колегата - провери дали числото се дели на някое от числата от 2 до корена му и само ако никога не се дели тогава е просто.

Когато решиш дали определено число е просто, го добавяш в лист, който си дефинирал преди да почнеш да циклиш по числата.

Това, което искаш да постигнеш (в последния коментар) да покажеш числата на определени позиции има добро начало - да ги вкарва в списък. Основният проблем е, че въртиш цикъл от 2 до 260. Искаш числатана позиция 24, 101 и 251. Това означава, че ти трябва поне 251 ПРОСТИ числа. В интервала 2 - 260 съм убеден, че няма 251 прости числа. Тъй като не знаем кое е 251вото просто число (още повече пък, че искаш тези позиции да идват от потребител, т.е. съвсем не знаем коя е максималната позиция, която ще въведе потребителя) става много трудно да се направи approximation до колко да се завърти цикъла.

Тук моето предложение е, ако ще ползваш List да въртиш цикъла докато листът не се напълни с 251 числа. Когато листът се напълни с 251 числа, break-ваш. Представи си го като едно while (true) и вътре проверка if(myList.Count >= 251) { break; }

Същото може да се псотигне всъщност и без списък. Просто си направи дена променлива, която да показва до кое просто число си стигнал. След това завърти цикъл, чието условие казва, че ще приключи само когато променливата стане 251.

Ето две решение - без и със списък, които се осланят на тази идея. Имат съответните коментари в тях:

Без списък: http://pastebin.com/u2bVDCTJ

Със списък: http://pastebin.com/d9ffy33N

Успех!

4
remote87 avatar remote87 121 Точки

Страшно много благодаря RoYaL и за решенията и за готините обяснения!!! :) 

Дано на някой са му полезни също толкова, колкото и на мен 

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