The Daily Click ::. Forums ::. Non-Klik Coding Help ::. prime perfect
 

Post Reply  Post Oekaki 
 

Posted By Message

Cecilectomy

noPE

Registered
  19/03/2005
Points
  305

Has Donated, Thank You!VIP MemberWeekly Picture Me This Winner!Cardboard BoxGhostbuster!Pokemon Ball!ComputerBox RedSanta HatSnowman
I am an April Fool
2nd November, 2007 at 23:12:25 -

so im not new to programming. but have been off the scene for a long while.
taking c++ in college at the moment and i recently got a request from a friend up in seattle, washington (me down in california) to make a program that computes all the perfect numbers from 0 to 10,000. simple enough. but i wanted to take it further, to try and compute as many perfect numbers as i can. according to wikipedia there are 44 recorded even perfect numbers. my program can compute the first seven. it works perfectly. the only problem i encounter is the digit range limitations of c++. the eighth perfect number is too large to handle. if i try to do anything bigger than what i have it stops running. is there anyway around this?


/* header files */

#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<conio.h>
#include<cmath>

using namespace std;

/* function prototypes */

void primenumber();
void perfectnumberoutput();

/* variable identifiers */

float prime_factor_check;//variable where value of ((2^n)-1) stored so it can be checked if it is a prime number
__int64 perfect_number = 0;//variable where the computed value of a valid perfect number is stored
int n = 0;//the 'n' value in the expression (pow(2.0,n-1) * (pow(2.0,n)-1))
bool prime = false;//boolean identifier to show if (pow(2.0,n)-1) is a prime number

void main()
{
cout << "The First Seven Perfect Numbers Are:" << endl << endl << ": ";

while(perfect_number < 100000000000)
{
primenumber();//call function primenumber()
perfectnumberoutput();//call function perfectnumberoutput()
n++;//increase 'n' once every program cycle
}

cout << endl << endl << "Hit any key to exit. . .";

while(_kbhit() == 0)
{//loop until a key is pressed
}
}

void primenumber()
{
for(int i = 2;i <= (pow(2.0,n)-1)-1;i++)
{//'for loop' to divide (pow(2.0,n)-1) by every number greater than 1 and less than itself
prime_factor_check = (pow(2.0,n)-1) / i;

if(!(prime_factor_check > static_cast<int>(prime_factor_check) && prime_factor_check < static_cast<int>(prime_factor_check + 1)))
{//'if statement' to check for any other factors of (pow(2.0,n)-1) besides 1 and itself making it a non prime number (composite number) and ending the 'for loop'
prime = false;
i = (pow(2.0,n)-1);
}
else
{//if there are no other factors of (pow(2.0,n)-1) besides 1 and itself then (pow(2.0,n)-1) is a prime number
prime = true;
}
}
}

void perfectnumberoutput()
{//outputs all of the perfect numbers that were computed
if(prime == true)
{
if(perfect_number < 10000000000)
{
perfect_number = (pow(2.0,n-1) * (pow(2.0,n)-1));
cout << fixed << setprecision(0) << perfect_number;
cout << " : ";
}
}
}


Image Edited by the Author.

Image Edited by the Author.

 
n/a

DaVince

This fool just HAD to have a custom rating

Registered
  04/09/2004
Points
  7998

Game of the Week WinnerClickzine StaffHas Donated, Thank You!Cardboard BoxDos Rules!
3rd November, 2007 at 07:23:33 -

Maybe it's your compiler?

http://www.thescripts.com/forum/thread63790.html
In that (2005) thread there are some people stating that __int64 is not (fully) supported in some compilers, or implemented in a different way.

 
Old member (~2004-2007).

Cecilectomy

noPE

Registered
  19/03/2005
Points
  305

Has Donated, Thank You!VIP MemberWeekly Picture Me This Winner!Cardboard BoxGhostbuster!Pokemon Ball!ComputerBox RedSanta HatSnowman
I am an April Fool
3rd November, 2007 at 18:59:54 -

i actually read that thread in my search for answers before i posted here.
Ron Natalie in that thread remarks "__int64 is a[n] implementation extension by some compilers (notably Visual C++)."

i'm using visual c++ 2005

__int64 can hold integers up to 19 digits and the integer 9223372036854775807 (i tested, it will hold and output that number from an __int64 variable) which should be perfectly fine for the 8th perfect number coming out to be 2305843008139952128, less than the maximum of __int64.

shouldnt there be another way perhaps around this?

 
n/a

Cecilectomy

noPE

Registered
  19/03/2005
Points
  305

Has Donated, Thank You!VIP MemberWeekly Picture Me This Winner!Cardboard BoxGhostbuster!Pokemon Ball!ComputerBox RedSanta HatSnowman
I am an April Fool
4th November, 2007 at 22:07:13 -

im guessing no one really wants to help at this point or doesnt want to take the time to. but i do beleive i have figured out my problem for the eighth perfect number. the algorithm used to compute if (2^n)-1 is a prime number is just taking a long time. its a pretty big number to check. (2^31)-1 = 2147483647, which by my algorithm has to divide itself by every number greater than one and less than itself. whereas the seventh perfect number is only (2^19)-1 = 524287. which is vastly less than the eighth. so my program will generate the 8th perfect number given enough time. buuuut. it will then come into the problem previously mentioned when trying to compute the 9th perfect number, not enough storage for such a big number. if anyone can help it would be greatly appreciated.

knowledge is power!

Image Edited by the Author.

 
n/a

Peblo

Custom ratings must be 50 characters or less

Registered
  05/07/2002
Points
  185

Game of the Week WinnerVIP MemberI'm on a Boat360 OwnerAttention GetterThe Cake is a LieCardboard BoxHero of TimePS3 OwnerIt's-a me, Mario!
I'm a Storm TrooperSonic SpeedStrawberryI like Aliens!Wii OwnerMushroomGhostbuster!
4th November, 2007 at 23:22:38 -

Some people don't know languages outside of MMF .

 
"Isn't it always amazing how we characterize a person's intelligence by how closely their thinking matches ours?"
~Belgarath

Cecilectomy

noPE

Registered
  19/03/2005
Points
  305

Has Donated, Thank You!VIP MemberWeekly Picture Me This Winner!Cardboard BoxGhostbuster!Pokemon Ball!ComputerBox RedSanta HatSnowman
I am an April Fool
5th November, 2007 at 02:45:32 -

how sad. knowing even just the basics of other languages makes it so much easier to code in the already very simple user interface of clickteam products.

anyway. aside from my number size limitations. i optimized my code so it produces the first 8 perfect numbers within about less than a second. if only someone did know how to help me. i will continue my search elsewhere.

thanks a bunch.

 
n/a

DaVince

This fool just HAD to have a custom rating

Registered
  04/09/2004
Points
  7998

Game of the Week WinnerClickzine StaffHas Donated, Thank You!Cardboard BoxDos Rules!
5th November, 2007 at 14:45:09 -

I know the basics of C++. I just don't know any math or why that won't work.

 
Old member (~2004-2007).

Cecilectomy

noPE

Registered
  19/03/2005
Points
  305

Has Donated, Thank You!VIP MemberWeekly Picture Me This Winner!Cardboard BoxGhostbuster!Pokemon Ball!ComputerBox RedSanta HatSnowman
I am an April Fool
5th November, 2007 at 18:48:42 -

well the math is correct. the program is perfect. its just the numbers get way too big to handle. so i cant get anything bigger than the eighth number. unless theres away around that limitation.

im over it though. on to other problems .

 
n/a
   

Post Reply



 



Advertisement

Worth A Click