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...