//Berezvai Dániel
//BEDTACI.ELTE
//Számoljuk meg, hány prímszám esik adott intervallumba!
#include <fstream>
#include <iostream>
#include <math.h>
#include <sstream>
#include <stdlib.h>
#include <string>
using namespace std;

//A primek.be fájlt én írtam. A számokat: http://primes.utm.edu/lists/small/10000.txt fájlból másoltam. Először egyszerüen a forráskkódba raktam be, de hamar rájöttem, hogy beolvasni szebb megoldás (ha lassabb is).

ifstream f ("primek.be");
ofstream o ("primek.ki");
int maxN=10000; //elso 10000 prim jo kezdet.

int stoi(string s){ //string to integer
	return atoi(s.c_str());
}

string itos(int i){
	stringstream s;
	s<<i;
	return s.str();
}

void out(string s){
	cout<<s<<endl;
	o<<s<<endl;
}

int IntArrF(int maxN, int arr[]){
//int primek[10000]={2, 3, 5, 7, ... 104723, 104729}
	string devnull;
	string s;
	getline(f,devnull,'{');//A valtozo inicializalast eldobjuk.
//2, 3, 5, 7, ... 104723, 104729}
	int i=0;
	while(!f.eof() && i<maxN){
		getline(f,s,',');
		arr[i]=stoi(s);
		i++;
	}
	return i;
}

int IntervallumbaEsoketMegszamol(int lo, int hi, int intervallum[], bool kerlistat){
//elmegyunk lowerBound-ig, lepsszam: i
int i=0;
	while(intervallum[i]<lo){
		i++;
	}
//innen elmegyunk higherBound-ig, lepsszam: j-i
int j=i;
hi++;//Egyenlöséget is megengedjük, ezért növeljük 1-gyel.
	while(intervallum[j]<hi){
		if(kerlistat){
			out(itos(intervallum[j]));
		}
		j++;
	}
//j es i kulonbsege a primek szama az intervallumban.
	return j-i;
}

int main(int argc, char *argv[]){//Új: paraméterek argument count, argument values
	if(argc<2){out("Primszam Invervallumban\n");}//Csak akkor írjuk ki a program nevét, ha nincs elég paraméter.
	int lo=0;//teszteleshez, kesobb felul lesz irva
	int hi=0;//Majdnem minden prím ebbe az intervallumba esik. (Mindössze 408 db marad ki.)
	bool kerlistat=true;
/*Tesztelés esetén kikommentelhető, vagy Code::Blocks-ban be lehet állítani, milyen paramétereket akarunk a programnak átadni debug során.*/
	if(argc>2){ //3 vagy tobb paraméter: futtatott fájl neve mindig a [0], lowBound az [1] és upperBound (vagy highBound) a [2].
		lo=stoi(argv[1]);
		hi=stoi(argv[2]);
		if(argc<4){ //Ha van [3], akkor kér prímlistát, különben nem.
			kerlistat=false;
		}
	}else{
		out("Legalabb ket parametert kerek! PrimszamIntervallumban.exe 'intervallum kezdet' 'intervallum veg' [kersz-e listat]");
		return 1;
	}
	if(hi>104729){
		out("A program csak 104729-ig mukodik! (Az elso 10000 prim szam.)");
		return 2;
	}
	if(lo>hi){
		out("Az intervallum kezdet nem lehet nagyobb, mint a veg!");
		return 3;
	}
//*/
	int primek[maxN];
	IntArrF(maxN, primek);

	int valasz=IntervallumbaEsoketMegszamol(lo, hi, primek, kerlistat);
	out("A(z) "+itos(lo)+" - "+itos(hi)+" intervallumba eso primek szama: "+itos(valasz)+".");
	return 0;
}
