PROGRAMOWANIE I ALGORYTMY

Liczby kwadratowe


Zad. 1. W pliku kwadratowe.txt znajduje się 1000 liczb kwadratowych.

a) do pliku a.txt, skopiuj wszystkie liczby, których początkowe cyfry tworzące liczbę podniesioną do kwadratu dadzą tą liczbę np. 100 = 102.

b) do pliku b.txt skopiuj wszystkie liczby, w których istnieje taka kombinacja cyfr tej liczby, z których stworzona liczba podniesiona  do kwadratu da tą liczbę, np. 5476 = 742.

 


Rozwiązanie

//algorytm.edu.pl
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

//funkcja zwraca ilość cyfr podanej liczby
int ile_cyfr(int liczba)
{
	int i = 0;
	while(liczba!=0)
	{
		i++;
		liczba/=10;
	}
	return i;
}

//funkcja określająca, czy podana liczba spełnia kryteria zadania
bool b(int liczba)
{

	int kw = (int)sqrt(liczba); //zmienna przechowuje kwadrat liczby
	int ile = ile_cyfr(kw); //zmienna przechowuje ilość cyfr kwadratu liczby
	int ile2 = ile_cyfr(liczba); //zmienna przechowuje ilość cyfr liczby
	int *tab = new int[ile]; //tablica przechowująca cyfry kwadratu liczby
	int *tab2 = new int[ile2]; //tablica przechowująca cyfry liczby
	int i = 0;
	//zapisanie cyfr kwadratu liczby do tablicy

	while(kw!=0)
	{
		tab[i++] = kw%10;
		kw/=10;
	}

	//zapisanie cyfr liczby do tablicy
	i = 0;
	int pom = liczba; //zmienna pomocnicza zapobiegająca stracie wartości zmiennej liczba

	while(pom!=0)
	{
		tab2[i++] = pom%10;
		pom/=10;
	}

	//szukanie cyfr kwadratu liczby w liczbie
	bool ok; //zmienna określająca, czy dana liczba spełnia kryteria zadania

	for(int i = 0;i<ile;i++)
	{
		int pom = liczba;
		ok = false;
		for(int j = 0;j<ile2;j++)
		{
			//sprawdzenie czy istnieje cyfra
			if(tab[i]==tab2[j])
			{
				tab2[j] = -1; //wyeliminowanie znalezionej cyfry (eliminacje błędu w przypadku kilku takich samych cyfr)
				ok=true;
				break;
			}
		}

	if(!ok)
		break;
	}
	delete [] tab;
	return ok;
}

int main()
{

	ifstream odczyt("kwadratowe.txt");
	ofstream zapis("b.txt");

	int liczba;

	while(!odczyt.eof())
	{
		odczyt>>liczba;
		if(b(liczba))
		zapis<<liczba<<endl;
	}

	odczyt.close();
	zapis.close();

	return 0;
}

Zad. 1. W pliku kwadratowe.txt znajduje się 1000 liczb kwadratowych.

a) do pliku a.txt, skopiuj wszystkie liczby, których początkowe cyfry tworzące liczbę podniesioną do kwadratu dadzą tą liczbę np. 100 = 102.

b) do pliku b.txt skopiuj wszystkie liczby, w których istnieje taka kombinacja cyfr tej liczby, z których stworzona liczba podniesiona  do kwadratu da tą liczbę, np. 5476 = 742.

 


Rozwiązanie

//algorytm.edu.pl
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

//funkcja zwraca ilość cyfr podanej liczby
int ile_cyfr(int liczba)
{
	int i = 0;
	while(liczba!=0)
	{
		i++;
		liczba/=10;
	}
	return i;
}

//funkcja określająca, czy podana liczba spełnia kryteria zadania
bool b(int liczba)
{

	int kw = (int)sqrt(liczba); //zmienna przechowuje kwadrat liczby
	int ile = ile_cyfr(kw); //zmienna przechowuje ilość cyfr kwadratu liczby
	int ile2 = ile_cyfr(liczba); //zmienna przechowuje ilość cyfr liczby
	int *tab = new int[ile]; //tablica przechowująca cyfry kwadratu liczby
	int *tab2 = new int[ile2]; //tablica przechowująca cyfry liczby
	int i = 0;
	//zapisanie cyfr kwadratu liczby do tablicy

	while(kw!=0)
	{
		tab[i++] = kw%10;
		kw/=10;
	}

	//zapisanie cyfr liczby do tablicy
	i = 0;
	int pom = liczba; //zmienna pomocnicza zapobiegająca stracie wartości zmiennej liczba

	while(pom!=0)
	{
		tab2[i++] = pom%10;
		pom/=10;
	}

	//szukanie cyfr kwadratu liczby w liczbie
	bool ok; //zmienna określająca, czy dana liczba spełnia kryteria zadania

	for(int i = 0;i<ile;i++)
	{
		int pom = liczba;
		ok = false;
		for(int j = 0;j<ile2;j++)
		{
			//sprawdzenie czy istnieje cyfra
			if(tab[i]==tab2[j])
			{
				tab2[j] = -1; //wyeliminowanie znalezionej cyfry (eliminacje błędu w przypadku kilku takich samych cyfr)
				ok=true;
				break;
			}
		}

	if(!ok)
		break;
	}
	delete [] tab;
	return ok;
}

int main()
{

	ifstream odczyt("kwadratowe.txt");
	ofstream zapis("b.txt");

	int liczba;

	while(!odczyt.eof())
	{
		odczyt>>liczba;
		if(b(liczba))
		zapis<<liczba<<endl;
	}

	odczyt.close();
	zapis.close();

	return 0;
}