Program liczący pierwiastki c#

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

Zamień:

x = kontrol;

na:

break;

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

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).

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

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

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

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))

@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.

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

Możesz pokazać kod?

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

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

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

Zawsze wywala liczbę 1

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

Użyć liczb zmiennoprzecinkowych.

Yyyy :shock:

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