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