C/C++ Finding Perfect Number with C++

  • Thread starter Thread starter Freyster98
  • Start date Start date
  • Tags Tags
    C++
AI Thread Summary
The discussion centers on writing a program to determine if a user-provided number is perfect, utilizing a subroutine and a boolean for output control. The original code has a logical error in the condition that checks the boolean value, using "if(found=true)" instead of "if(found)". This mistake causes the program to always return that the number is perfect. Participants suggest best practices, such as placing constants first in comparisons to avoid assignment errors, and recommend using simpler boolean checks. Alternate code snippets are provided, demonstrating different approaches to implementing the perfect number check, including using a square root limit for efficiency and various methods to determine if a number is prime. Overall, the thread highlights common pitfalls in programming logic and offers solutions for improving code accuracy and readability.
Freyster98
Messages
49
Reaction score
0
I am supposed to write a program to test a user-provided number to see if it is perfect. Also, I have to use a subroutine to do the test, and call to that in the main program. Finally, I must use a boolean to control the final output. I understand that it would be SO MUCH easier if I could just write a simple program to do this without the boolean and subroutine, but an assignment is an assignment. Here is what I have so far...it runs, but no matter what number I enter when running the program, it comes back as perfect. Can anyone see what I am doing wrong? Any help would be appreciated.

Code:
#include<iostream>
#include<cmath>
using namespace std;

void Perfect(int number,int&ans,bool&valid)
{
	int sum=0;
	valid=false;
	for(int i=1;i<=number/2;i++)
	{
		if(number%i==0)
			sum+=i;
	}
	if(sum==number)
		valid=true;
		ans=sum;
}

void Perfect(int,int&,bool&);
char ch;

void main()
{
	int num,answer; 
	bool found;
	cout<<"Enter the number you want to test to see if it is perfect: ";
	cin>>num;
	Perfect(num,answer,found);
	if(found=true)
	{
		cout<<num<<" is a perfect number.";
	}
	else
	{
		cout<<num<<" is NOT a perfect number.";
	}
	cin>>ch;
}
 
Technology news on Phys.org
Code:
if(found=true)
doesn't do what you think it does!
 
mgb_phys said:
Code:
if(found=true)
doesn't do what you think it does!

I can't tell you how many times I've gone over this and completely missed that. Thank you for taking the time to help, I really appreciate it.
 
I can't tell you how many times I've gone over this and completely missed that.
Been there - done that - bought the Tshirt!

A good tip is to always put the constant first. eg.
if ( 2=count) or if ( true=found) then the compiler will warn you.

Even better is not to compare with true/false eg.
if (found) or if (!found) is much better.
 
Last edited:
Alternate C++ code:
Code:
#include<iostream>
#include<cmath>
using namespace std;

bool perfect(int n)
{
	int sum=0;
	int lim = (int)sqrt(n);
	for(int i=1; i <= lim; i++)
	{
		if(n%i == 0)
			sum += i + n/i;
	}
	return sum == n;
}

void main()
{
	int num;
	cout << "Enter the number you want to test to see if it is perfect: ";
	cin >> num;
	if(perfect(num))
		cout<<num<<" is a perfect number.";
	else
		cout<<num<<" is NOT a perfect number.";
}

Alternate function perfect (replace in the above):
Code:
bool isPrime(int n) {
	if ((n&1) == 0)
		return n == 2;
	if (n%3 == 0)
		return n == 3;
	if (n < 25)
		return n > 1;
	int lim = (int)sqrt(n);
	for (int i = 5; i <= lim; i += 4)
	{
		if (n%i == 0)
			return false;
		i += 2;
		if (n%i == 0)
			return false;
	}
	return true;
}

bool perfect(int n)
{
	int s = 0;
	while ((n&1) == 0)
	{
		s++;
		n >>= 1;
	}

	if (1 << s != (n+1) >> 1)
		return false;
	return isPrime(n);
}

Alternate function perfect (replace in the above; assumes 32-bit signed ints):
Code:
bool perfect(int n)
{
	if (n > 496)
		return n == 8128 || n == 33550336;
	return n == 6 || n == 28 || n == 496;
}
 
"Guys here is a short one if you appreciate"

#include<iostream>
#include<cmath>
using namespace std;


bool perfect(int number){
int sum=0;
bool flag=false;

for(int i=1;i<number;i++){
if(number%i==0)
sum+=i;
}

if(sum==number)
return true;
else
return false;


}


int main(){

int num;
bool q;
cout<<"Enter the number you want to test to see if it is perfect: ";
cin>>num;
q=perfect(num);
if(q)
cout<<"perfect number.\n";
else
cout<<"NOT.\n";
return 0;
}
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.

Similar threads

Back
Top