/* perf-adv.cpp -- calculate perfect numbers
 *
 * written by spirit
 * uses euklid : 2^(n-1) * (2^n -1), n E N
 *
 */

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cmath>

//remove next line if you want a bit more speed 
#define DEBUG 1

using namespace std;




bool is_perfect(double number) {
	int sum=1; int div;
	for(div = 2; div < number; div++) {
		if((int)number % div == 0)
			sum += div;
		else if(sum > number)
			break;
	}
		
	if(sum == number)
		return true;
	else
		return false;
}


int main(int argc,char* argv[]){
	double num = 1.;
	double testnum;

	while(1) {
		testnum = (pow(2., (num-1.)) * (pow(2., num )-1.)); 
		#ifdef DEBUG
		cout << "checking : \t" << num << "\t -> \t" << testnum ;
		#endif
		if(is_perfect(testnum)) {
			#ifdef DEBUG
			cout << " \tpositive! " << endl;
			#endif
			#ifndef DEBUG
			cout << testnum << " " ;
			#endif
		}
		#ifdef DEBUG
		else {
			cout << " \tnegative. " << endl;
		}
		#endif
		num++;
	}

return 0; //never to be reached ;-)
}

