Perfect, Abundant, Deficient program help

Shoothy's Avatar
Newbie Member
I'm supposed to create a program that tells if the users inputted number is perfect a bundant defficient, but the answers are all coming out with big numbers (abundant everytime). Here's the code i have:


Code:
#include<iostream>
#include<string>
using namespace std;
int subP(int num){
int ans[1000];
for(int x=1;x<=num;x++){
double test = 0;
test = num/x;
if(test == int(num/x)){
ans[x]=test;
}
}
cout<<endl;
cout<<num<<endl;
for(int y=0;y<=num;y++){
if(ans[y]=0){
cout<<y<<" ";
}
}
int sum=0;
for(int z=0;z<num;z++){
sum=sum+z;
}
return sum;
}
int main(){
Start:
int num=1;
int sum=0;
cout<<"Type a number: ";
cin>>num;
if(num==0){
goto end;
}
sum = subP(num);
cout<<endl<<sum;
if(sum<num)
cout<<endl<<"Deficient";
if(sum==num)
cout<<endl<<"Perfect";
if(sum>num)
cout<<endl<<"Abundant";
cout<<endl<<endl;
goto Start;
end:
cout<<"the end";
}

Last edited by shabbir; 14May2010 at 08:06.. Reason: Code blocks
0
Isaac Remuant's Avatar, Join Date: Apr 2010
Newbie Member
You should indent your code and enclose it between CODE tags for better understanding.

Also, comments help a great deal. Especially if you're asking for help. If you don't comment your code you won't even be able to understand it after a brief period of time. Having to analyze one's own intentions makes you lose valuable time. So... Make it a habit.

For example. There's no explanation of what subP is supposed to be doing and it's name is not indicative (At least not for me) of it's purpose.
Code:
int subP(int num){
	int ans[1000];
	for(int x=1;x<=num;x++){
		double test = 0;
		test = num/x;
		if(test == int(num/x)){
			ans[x]=test;
		}
	}
....
Now... Why did you hardcode 1000 for the array? Have you noticed what happens if you input a something bigger? You'll be out of bounds.

You either define a constant maximum somewhere so the user can't enter a higher value or you have a dynamic array instead of a static one.
Code:
if(test == int(num/x))
why is test a double and not an int?
Why do you typecase a int / int division? It will always return int. It will only return a floating point number if either one of it's elements is floating point.

The use of goto is a VERY VERY bad idea. Why did you use them instead of using loops?

I think you should explain what's your approach and how it's supposed to work. I don't get how you're trying to find if a number is perfect if you're not using the modulus to test if a number is a divisor.