1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Finding Perfect Number with C++

  1. Oct 30, 2008 #1
    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 (Text):
    #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;
    }
     
  2. jcsd
  3. Oct 30, 2008 #2

    mgb_phys

    User Avatar
    Science Advisor
    Homework Helper

    Code (Text):
    if(found=true)
    doesn't do what you think it does!
     
  4. Oct 30, 2008 #3
    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.
     
  5. Oct 30, 2008 #4

    mgb_phys

    User Avatar
    Science Advisor
    Homework Helper

    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: Oct 30, 2008
  6. Oct 30, 2008 #5

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    Alternate C++ code:
    Code (Text):
    #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 (Text):
    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 (Text):
    bool perfect(int n)
    {
        if (n > 496)
            return n == 8128 || n == 33550336;
        return n == 6 || n == 28 || n == 496;
    }
     
  7. Oct 11, 2011 #6
    "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;
    }
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Finding Perfect Number with C++
  1. C program-perfect (Replies: 5)

  2. C++ power of n number (Replies: 13)

Loading...