Program sprawdzający, czy zadane x jest kwadratem liczby całkowitej

Program sprawdzający, czy zadane x jest kwadratem liczby całkowitej
R0
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:3
0

Witam jestem totalnym laikiem jeśli chodzi o programowanie. Szukałem na internecie i nie mogę znaleźć a muszę taki program oddać na zajęcia.

Kopiuj
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int x;
	cout<<"Podaj x: ";
	cin>>x;
	for(int i=1;x>i;i++)
	{
		if(sqrt(x)==((int(x))*(int(x))))
		{
			cout<<"Ta liczba jest kwadratem liczby całkowitej";
		}
		else
		{
			cout<<"Ta liczba nie jest kwadratem liczby całkowitej";
		}
	}
	system("pause");
	return 0;
}

Program pisałem w devie w c++. Program ma mi pokazywać czy zadana liczba jest kwadratem liczby całkowitej a po odpaleniu programu program się chyba zapętla bo wyskakuje zawsze że ta liczba nie jest kwadratem liczby całkowitej i do tego napis wyskakuje po kilka razy. Czy mógłby mi ktoś w tym pomóc ?

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Wstawiaj kod w znaczniki kolorujące składnię;
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:1272
0

Na moje oko sprawdzasz czy kwadrat pewnej liczby jest jej pierwiastkiem i się dziwisz że nie jest :P. Próbowałeś z jedynką?

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0

Ciekawy jestem kiedy system edukacji przestanie wciskać IDE Dev C++.

@topic:
Lista problemów:

  • wypisujesz rezultat wewnątrz pętli, a powinieneś poza pętlą
  • warunek pętli jest zbyt szeroki
  • pomyśl nad lepszym algorytmem.

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Azarien
system edukacji "wciska" to co jest proste, działa każdemu i daje się łatwo zainstalować w 5 minut. wielkie IDE to overkill dla hello worldów.
MarekR22
ale Dev C++ nie działa od X lat (brak debugowania), a lepsze działające alternatywy istnieją.
Narkan
U siebie w szkole jakis czas temu usłyszałem że dev nie wymaga dobrych kompów... tylko że kupili rok temu i7 i dalej jest dev :D Dlatego też zacząłem nosić swój laptop na zajęcia.
ŚM
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:44
0

wystarczy sprawdzić czy pierwiastek tej liczby jest liczbą całkowitą

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0
Świetny Mleczarz napisał(a):

wystarczy sprawdzić czy pierwiastek tej liczby jest liczbą całkowitą

Nieprawda: http://ideone.com/UYtrWR


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
ŚM
źle to sprawdzasz - musisz wziąć pod uwagę dokładność liczb zmiennoprzecinkowych, poza tym wychodzisz poza zakres long long inta
MarekR22
celem tego kodu było udowodnienie właśnie, że twoje rozwiązanie działa, ale tylko łutem szczęścia, bo pojawia się problem z dokładnością. Poprawiłem typy i nie wykraczam poza zakres zmiennej, a problem nadal istnieje.
vpiotr
okazuje się że round() załatwia sprawę: http://ideone.com/FMATkX
R0
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:3
0

Dalej nie wiem jak to zrobić... Próbowałem samym if bez pętli for i dalej program nie działa tak jak powinien. Mógłby mi to ktoś jaśniej wytłumaczyć ? Wiem że program jest niby banalny ale dopiero co zacząłem programować dlatego proszę u wyrozumiałośc.

MarekR22
pokaż poprawkę. Kod otocz znacznikami <cpp></cpp>
R0
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:3
0
Kopiuj
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int x;
	cout<<"Podaj x: ";
	cin>>x;
		if((sqrt(x)*(sqrt(x))==(int(x))))
		{
			cout<<"Ta liczba jest kwadratem liczby całkowitej";
		}
		else
		{
			cout<<"Ta liczba nie jest kwadratem liczby całkowitej";
		}
	
	system("pause");
	return 0;
}

Zrobiłem to samym if oczywiście mój błąd był bo mnozyłem liczbę razy liczbę i sprawdzałem czy jest to pierwiastek a trzeba pomnozyć pierwiastek razy pierwiastek i sprawdzać czy to liczba. Mam jeszcze jedno pytanie czy wie ktoś może jak zrobić to za pomocą pętli for ?

dodanie znacznika <code class="cpp"> - @furious programming

edytowany 1x, ostatnio: flowCRANE
kaczus
źle mnożysz 2 liczby zmiennoprzecinkowe i czego się spodziewasz? Do odrobienia praca domowa - przeczytać ze zrozumieniem: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html
NI
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Łódź
  • Postów:1402
0
  1. to zły argument:
Kopiuj
if(sqrt(x)==((int(x))*(int(x)))) 

winno chyba być porównanie typu

Kopiuj
 i*i == x

dodatkowo poszukaj algorytmów przyśpieszających (chyba Krashan w Izviestii#12 napisał o tym bardzo prosty artykuł, jak znajdę i dostanę pozwolenie, to albo upublicznię, albo on upubliczni) Bo w sumie sprawa prosta, ale kolega ładnie to opisał i wolałbym udostępnić jego opis.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
1
MarekR22 napisał(a):

ale Dev C++ nie działa od X lat (brak debugowania)

Jak to nie działa.

dev.png

  • dev.png (68 KB) - ściągnięć: 610
pylaochos
Debugowanie działa ale wszyscy zostawili go jakieś 10 lat temu?
Azarien
@pylaochos: bo pierwotni twórcy (firma Bloodshed) go zostawiła. od kilku lat jest rozwijany przez innych ludzi.
drorat1
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Krasnystaw
  • Postów:1181
0

A nie tak?

http://stackoverflow.com/questions/12077354/is-there-a-very-fast-way-to-test-if-n-is-a-perfect-square-in-c
http://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root-is-an-integer

Kopiuj
 
#include <iostream>
#include <math.h>

using namespace std;

bool isSquareOfInteger(int n)
{
    return (sqrt(n) == floor(sqrt(n)));
}

int main()
{
    int n = 1;
    while (n)
    {
        cout << "Podaj liczbe calkowita (0 = wyjscie): ";
        cin >> n;
        if (isSquareOfInteger(n))
        {
            cout << "Liczba " << n << " jest kwadratem liczby calkowitej\n";
        }
        else
        {
            cout << "Liczba " << n << " nie jest kwadratem liczby calkowitej\n";
        }
    }
    return 0;
}
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Dla "dużych" liczb jest jednak problem. Np. pierwiastek z 68000000*68000000+1 jest liczbą całkowitą http://ideone.com/59DuN0


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
kaczus
dałem wyżej link do strony w której opisuje, że liczby zmiennoprzecinkowe im większe, tym mniej dokładne, a dodawanie małej liczby do dużej wpowadza duży bład i zaokrąglenia tego nie poprawią!
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Łódź
  • Postów:1402
0

Obiecany algorytm obliczania pierwiastków z liczby całkowitej.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
edytowany 1x, ostatnio: kaczus
CLNCD0714
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:6
0

Nie wiem nad czym się zastanawiać. Bierzesz wartość z sqrt i sprawdzasz czy część dziesiętna jest równa 0.
Nie piszę na co dzień w C++ ale powinna być funkcja która zwraca część dziesiętną liczby.

Ogólnie

Kopiuj
if Frac( sqrt(x) ) == 0 then 
...

ewentualnie jak nie ma funkcji to

Kopiuj
...
y = sqrt(x);
y = y-long(y);
if y == 0 then
...

y oczywiście jest typem float

Edit:

Kopiuj
#include "main.h";
#include <iostream>
#include <cmath>

using namespace std;
int main()
{
	int x;
	cout << "Podaj x: ";
	cin >> x;
	
	double param, fractpart, intpart;

	double y = sqrt(x);
	fractpart = modf(y, &intpart);

	if ( fractpart == 0 )
	{
		cout << "Ta liczba jest kwadratem liczby całkowitej";
	}
	else
	{
		cout << "Ta liczba nie jest kwadratem liczby całkowitej";
	};
	
	system("pause");
	return 0;
}

@kaczus - podaj mi kwadrat liczby całkowitej dla której ten program nie zadziała.

dodanie znaczników <code class="cpp"> - @furious programming


Tyl­ko dwie rzeczy są nies­kończo­ne: wszechświat oraz ludzka głupo­ta, choć nie jes­tem pe­wien co do tej pierwszej.
edytowany 3x, ostatnio: flowCRANE
Zobacz pozostałe 8 komentarzy
flowCRANE
@CLNCD0714 - wstawiaj kod w znaczniki kolorujące składnię;
bogdans
@CLNCD0714, z typem int nie ma problemu. W pierwszym poście była mowa o liczbie całkowitej - bez ograniczenia z góry na jej wielkość. Napisałeś podaj mi kwadrat liczby całkowitej dla której ten program nie zadziała. Poprawne działanie na kwadratach liczb całkowitych nie wystarcza, podałem przykład liczby 68000000*68000000+1, którą Python uznał za kwadrat liczby naturalnej.
CLNCD0714
To wszystko zależy od celu programu. Akurat podany przez Ciebie przypadek zwraca mi prawidłowe wartości przy zmianie typu na long long. Gdyby okazało się że typ jest niewystarczający to można użyć typu bigdecimal. Natomiast macie oczywiście rację odnośnie niedoskonałości odwzorowania liczb zmiennoprzecinkowych.
bogdans
Akurat podany przez Ciebie program (po zmianie typu na long long) daje mi błędną odpowiedź dla liczby 68000000*68000000. Dla obu tych liczb następuje przekroczenie zakresu i wyniki programu nie maja żadnej wartości.
CLNCD0714
Z ręki wpisz 4624000000000000 oraz 4624000000000001
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)