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 'Star maps using Blender'
Blender just recently dropped a new version, 4.5(with 5.0 on the horizon), and within it was a new feature for which I immediately thought of a use for. The new feature was a .csv importer for Geometry nodes. Geometry nodes are a method of modelling that uses a node tree to create 3D models which offers more flexibility than straight modeling does. The .csv importer node allows you to bring in a .csv file and use the data in it to control aspects of your model. So for example, if you...
I tried a web search "the loss of programming ", and found an article saying that all aspects of writing, developing, and testing software programs will one day all be handled through artificial intelligence. One must wonder then, who is responsible. WHO is responsible for any problems, bugs, deficiencies, or whatever malfunctions which the programs make their users endure? Things may work wrong however the "wrong" happens. AI needs to fix the problems for the users. Any way to...

Similar threads

Back
Top