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