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

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.

#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 ?

0

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

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

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

0
Świetny Mleczarz napisał(a):

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

Nieprawda: http://ideone.com/UYtrWR

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.

0
#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

0
  1. to zły argument:
if(sqrt(x)==((int(x))*(int(x)))) 

winno chyba być porównanie typu

 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.

1
MarekR22 napisał(a):

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

Jak to nie działa.

dev.png

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

 
#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;
}
0

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

0

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

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

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

ewentualnie jak nie ma funkcji to

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

y oczywiście jest typem float

Edit:

#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

1 użytkowników online, w tym zalogowanych: 0, gości: 1