Witajcie, rozwiązuje zadanie maturalne o poniższej treści:
W Trójkolandii za liczby naturalne uznaje się tylko te liczby całkowite dodatnie, które w wyniku dzielenia przez 3
dają resztę 1
, tzn.: 1, 4, 7, 10, 13, 16, 19, 22, 25, 28
...
Aby liczba n > 1
była liczbą pierwszą w Trójkolandii, musi spełniać następujące warunki:
• reszta z dzielenia n
przez 3
jest równa 1
,
• wszystkie dzielniki liczby n
(poza n
oraz 1
) dzielone przez 3
dają resztę różną od 1
,
czyli liczba n nie ma dzielników (poza 1
i n
), które w Trójkolandii są traktowane jak liczby naturalne. Przykładami liczb uznawanych w Trójkolandii za pierwsze są: 4
, 10
, 22
i 25
, ponieważ nie mają one dzielników (mniejszych od nich samych i większych od 1
), które przy dzieleniu przez 3
dają resztę 1
, ale liczba 16
nie jest w Trójkolandii pierwsza (bo ma dzielnik 4
).
Napisz program, który wypisze w pliku zadanie4.txt
:
a) liczbę liczb pierwszych w Trójkolandii w przedziale [1, 20]
b) liczbę liczb pierwszych w Trójkolandii w przedziale [21, 1000]
c) liczbę liczb pierwszych w Trójkolandii w przedziale [1001, 1000000]
d) liczbę liczb pierwszych w Trójkolandii w przedziale [1000001, 10000000]
.
Dla podpunktów a
i b
otrzymuję poprawne wartości, odpowiednio: 5
oraz 168
. Natomiast dla c
i d
mam złe, odpowiednio: 98326
(powinno być 1797
), 765815
(a tutaj 862344
).
Szczerze mówiąc nie wiem czy popełniłem jakiś błąd w rozumieniu zadania, czy źle napisałem program, proszę Was o pomoc. :)
#include <iostream>
#include <cstdlib>
using namespace std;
bool pierwsza (int i)
{
if(i<=1)
{
//cout<<i<<endl;
return false;
}
if(i%3!=1)//je¿eli nie jest naturalna(w trojkolandii)
{ //cout<<i<<endl;
return false;
}
for(int j=2;j*j<=i;j++)
{
if(j%3==1)
{
if(i%j==0)
{
return false;
}
}
}
//cout<<i<<endl;
return true;
}
int liczbypierwsze(int p,int k)
{
int licznik=0;
for(int i=p;i<=k;i++)
{
if(pierwsza(i))
licznik++;
}
return licznik;
}
int main()
{
int a,b,c,d;
a=liczbypierwsze(1,20);
b=liczbypierwsze(21,1000);
c=liczbypierwsze(1001,1000000);
d=liczbypierwsze(1000001,10000000);
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
system("PAUSE");
return 0;
}
gruntowne sformatowanie treści posta - furious programming