Programowanie i algorytmy

Liczby parzyste i kwadratowe

Zad. 1. W pliku dane.txt znajduje się w kolejnych wierszach 1000 liczb z przedziału [0;999999].

a) do pliku a.txt wpisz ilość liczb parzystych znajdujących się w pliku dane.txt w następującej postaci: "Liczb parzystych jest [ilość liczb]"

b) do pliku b.txt skopiuj wszystkie liczby z pliku dane.txt, w których cyfra dziesiątek jest równa 7 lub 0

c) do pliku c.txt skopiuj wszystkie liczby, które są kwadratami liczb całkowitych, np. taką liczbą jest liczba 225, ponieważ

 

{tex}225 = 15^2{/tex}.

 

 

Rozwiązanie

Podpunkt a)

W tym zadaniu należy wprowadzić zmienną całkowitą, która będzie zliczała kolejne liczby parzyste. Wartość początkowa tej zmiennej jest równa 0 (na początku programu nie mamy znalezionej żadnej liczby całkowitej).

Do sprawdzenia parzystości liczby można skorzystać z jednej z dwóch warunków:

  • if(liczba%2==0) - jeśli reszta z dzielenia liczby przez 2 jest równa 0, oznacza to, że jest to liczba parzysta
  • if(liczba&1==0) - jeśli pierwszy bit na prawo jest równy 0, oznacza to, że jest to liczba parzysta

 

Rozwiązanie
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
 
  ifstream odczyt("dane.txt");
  ofstream zapis("a.txt");
  int liczba;
  int ile=0; //zmienna licząca liczby parzyste
 
  while(!odczyt.eof())
  {
 
    odczyt>>liczba;
 
    if(liczba%2 == 0)
      ile++;
  }
 
  zapis<<"Liczb parzystych jest "<<ile;
 
  odczyt.close();
  zapis.close();
  system("PAUSE");
  return 0;
}

 

Podpunkt b)


W tym przypadku rozwiązanie będzie wyglądało podobnie do podpunktu a. Należy tylko sprawdzić, czy cyfrą jedności jest cyfra 0 lub 7. Wystarczy określić czy reszta z dzielenia przez 10 jest równa 0 lub 7:

if(liczba%10==0 || liczba%10 == 7) ...

Podpunkt c)

Aby sprawdzić, czy dana liczba jest pierwiastkiem liczby całkowitej należy porównać jej pierwiastek z częścią całkowitą pierwiastka tej liczby. Jeśli zachodzi równość, oznacza to, że liczba spełnia kryteria zadania, np.:

{tex}\left [ \sqrt{225}\right ] = \sqrt{225}{/tex},

a więc liczba 225 spełnia kryteria zadania, natomiast

{tex}\left [ \sqrt{15}\right ] \neq \sqrt{225}{/tex},

a więc liczba 15 nie spełnia kryteriów zadania, gdzie nawias [] oznacza część całkowitą z liczby.

W rozwiązaniu zadania, potrzebna będzie znajomość teorii z zakresu rzutowania typów.

Rozwiązanie
#include <cstdlib>
#include <iostream>
#include <fstream>
#incldue <cmath>
 
using namespace std;
 
int main()
{
 
  ifstream odczyt("dane.txt");
  ofstream zapis("b.txt");
  int liczba;
 
  while(!odczyt.eof())
  {
    odczyt>>liczba;
 
    if((int)sqrt(liczba)==sqrt(liczba)) //sprawdzenie czy część całkowita
      zapis<<liczba<<endl;  // liczby jest równa pierwiastkowi tej liczby
 
  }
 
  odczyt.close();
  zapis.close();
  system("PAUSE");
return 0;
}