Професионална програма
Loading...
+ Нов въпрос
Daniel.Pavlov avatar Daniel.Pavlov 6 Точки

4. Sieve of Eratosthenes

Здравейте колеги! Ще се радвам да помогнете. Много си играх да разбера как от стринг да направя масив, или по точно:

string arrString = "1 2 3 4 5";

int[] arr = arrString.Split('  ' ).Select(int.Parse).ToArray();

Console.WriteLine(string.Join(" ",arr));

Този пример горе работи и си печата масива с петте елемента.

Но като се пробвам да реша тази задача и накрая опитвам да направя това същото нещо и ми дава грешка на ред 33.

Целта е да се намерят всички прости числа от 1 до n, да се вкарат в масив и да се отпечат.

Ето и кода:

https://pastebin.com/AxgfHH1B

Благодаря!

Тагове:
0
Fundamentals Module
Quake3 avatar Quake3 547 Точки
Best Answer

Не знам дали логиката е правилна, но направих следното:
Разделих:

int[] arr = arrString.Split(' ').Select(int.Parse).ToArray();

на по-малки части:

var temp = arrString.Split(' ');
var temp2 = temp.Select(int.Parse);
int[] arr = temp2.ToArray();

След това сложих breakpoint на temp и въведох 7. Ясно се вижда, че temp (string array) съдържа 5 елемента, като последният е празен (empty string).

Избегнах го, като замених: 

var temp = arrString.Split(' '); 

с  

var temp = arrString.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

Грешка на ред 33, вече няма. Надявам се да съм помогнал.

P.S. Няма ли да е по-добре, вместо в string, директно да добавяш в int array?

0
10/05/2018 02:10:03
Daniel.Pavlov avatar Daniel.Pavlov 6 Точки

Здравей, благодаря ти за помоща :) Определено така ще е по-лесно с директно добавяне към масива, но не се сетих как. А и не знам каква дължина да му сложа. Бих се възползвал отново от помоща ти, даже се сетих за един пример:

int[] evenNumbers = new int[?];

            for (int i = 0; i < 20; i++)
            {
                if (i % 2 == 0)
                {
                    //Искам да го добавям към масива... Но как?
                }
            }

Задължително ли е винаги масива да има предопределена дължина? Искам да е по-гъвкав :)

Мерси!

0
Quake3 avatar Quake3 547 Точки

Здравей,
Виж: array of an unknown length. Използвай List<int>, а ако задължително трябва да е масив, то дължината му няма да е по-голяма от "input". Съответно трябва да има и някакъв брояч за намерените "isPrime", както и накрая, може да се изполва Array.Resize, за да се намали дължината на масива до counter. Примерно.

При evenNumbers, предполагам дължината ще е равна на половината от всичките. Добавянето ще бъде или с отделен брояч или с някакво производно от i, примерно (int)i/2, например int counter = (int)i/2; evenNumbers[counter ] = i;

0
10/05/2018 02:55:48
TeMePyT avatar TeMePyT 142 Точки

https://pastebin.com/hRcKcQLp Ето как съм я измислил аз. Както каза Quake3, дължината на масива няма как да е по-голяма от числото до което търсим всички прайм. За това създаваме масив от n+1 числа(+1 защото започваме от 0). След това с цикъл вкарваш числата до n(arr[i]=i). За твоето решение-мисля че arrString += i + " "; ще трябва да стане arrString += i;. След това със string.Join ще си наслагаш спейсовете, във стринга не ти трябват.

1
10/05/2018 09:20:54
BoYaN avatar BoYaN 331 Точки

Само че това не е алгоритъма за Ситото. Виж тук има анимация какво трябва да се случи. Ето и едно решение на Python
 

0