Program liczący pierwiastki c#


(Jarek P) #1

Witam.

Postanowiłem napisać program, który policzy nap pierwiastki. Np. Wpisujemy 4 i wyrzuca 2.

Natknąłem się na pewien problem...

Po kliknięciu licz, program się zwiesz i nie che iść dalej. Oto kod:

double kontrol = double.Parse(textBox1.Text);

                double odpowiedź;

               for (double x = 0; x != kontrol;x = x + 0.00001 )

               {


                  if(x*x == kontrol)


                  { odpowiedź = x;


                  label3.Text = odpowiedź.ToString();

                  x = kontrol;



                  }


               }

I nie chodzi tu na pewno o

x = x + 0.00001

, bo zmniejszałem nawet do 1 i nic to nie dało,a zawsze podawałem pierwiastek kwadratowy z 4


([alex]) #2

Zamień:

x = kontrol;

na:

break;

Nie dla każdej liczby znajdzie się pierwiastek w ten sposób. Dla wyliczenie pierwiastka jest funkcja sqrt.


(Fiołek) #3

Zastanów się, kiedy ta pętla się zatrzymuje. Gdy trafisz na odpowiednią liczbę(dla tego przypadku będzie to po około(ponad?) 200000 iteracjach) przypisujesz do zmiennej x wartość kontrol i... zwiększasz ją o 0.00001 :wink: przez co pętla nie może się zakończyć i trwa to bez końca. Zamiast przypisywać kontrol do x wstaw tam break i będzie dobrze(choć tą pętle i tak można skrócić, zresztą, ona w ogóle nie jest potrzebna, od tego jest System.Math.Sqrt).


(Jarek P) #4

Dzięki teraz działa :slight_smile: Ale pozostaje kwestia pierwiastków sześciennych...


(Drobok) #5

Ja bym skorzystał z rozkładu na czynniki pierwsze, nie musiałbyś wtedy liczyć nieskończonej liczby kombinacji w wypadku dużych liczb ;]


(Jarek P) #6

To była wersja 1.0 :lol: Optymalizacją mogę się zająć na samym końcu, bo to nieduży programik :smiley:


(Fiołek) #7

Dla pierwiastków sześciennych skorzystaj z metody Math.Pow(jako iż potęgowanie jest działaniem odwrotnym do pierwiastkowania) - za wykładnik podstaw odwrotność stopnia pierwiastka(czyli dla sześciennego: Math.Pow(x, 1/3))


(Tomek Matz) #8

@Jarek P

x = kontrol; to nie jedyny problem. Przykładowo u mnie ten Twój kod nie działa, a wynika to z tego, że wartości dwóch zmiennych typu double nie powinno się porównywać przy użyciu operatora == (chyba, że zrobisz własną strukturę np. MyDouble dziedziczącą po Double i przeciążysz w niej ten operator). Materiałów w sieci na ten temat jest dość sporo. Zacznij od tego linku http://blogs.msdn.com/b/kirillosenkov/a ... sults.aspx, bo dobitnie pokazuje na czym polega problem.


(Jarek P) #9

Hmmmm Zastanawia mnie tylko jedna rzecz. Coś robię nie tak. Kombinuję z Math.Pow, ale zawsze wychodzi 0...


(Tomek Matz) #10

Możesz pokazać kod?


(Jarek P) #11

Ok to już rozwiązałem... Ale co dalej? Pętla for szłaby z miesiąc...


(Drobok) #12

To co podał ci matzu nie wymaga pętli :stuck_out_tongue:


(Jarek P) #13
label3.Text = Math.Pow(Double.Parse(textBox1.Text), 1 / 3).ToString();

Zawsze wywala liczbę 1


(Sawyer47) #14

1 / 3 - dzielenie całkowite, da 0, a x^0 to 1.

Użyć liczb zmiennoprzecinkowych.


(Jarek P) #15

Yyyy :shock:


(Fiołek) #16

Zamiast "1/3" wstaw "1/3.0", dokładnie tak jak napisał nr47.