Epic Systems Interview Question
Software Engineer / DevelopersThe number is nothing but a perfect number. Here is the java code to find the perfect number:
public void isPerfectNumber(int n)
{
int sum = 0;
for(int i = 1; i <= n-1; i++)
{
if(n%i == 0)
{
sum = sum + i;
}
}
if(sum == n)
System.out.println("The number is a perfect number");
else
System.out.println("The number is not a perfect number");
}
How about following solution?
Idea is to take scan from 2 to sqrt(n) and add i and n/i if n%i == 0;
eg.
for n = 12,
sqrt(n) ~ 3
sum = 1 + (2 + 6) + (3 + 4)
bool isPerfectNumber(int n)
{
int sum = 0;
int mid = sqrt(n);
if(mid*mid == n) sum+=mid;
if(n>0) sum+=1;
for(int i = 2 ; i < mid;i++)
{
if(n%i == 0) sum += i + n/i;
}
return sum == n;
}
public class General {
int add = 0;
static int originalValue = 100;
public static void main(String[] args) {
if(args[0] != null){
originalValue = Integer.parseInt(args[0]);
}
General gn = new General();
gn.findFactor(originalValue, 2);
}
public int findFactor(int number,int divisor){
int value = number%divisor;
int returnvalue = -1;
if(value == 0){
returnvalue = number/divisor;
System.out.println(divisor);
add = add + divisor;
if(returnvalue == 1){
if(divisor == originalValue){
System.out.println("No factors, prime number");
}
else{
if(add == originalValue){
System.out.println("You are lucky, factors add to original value");
}
else{
System.out.println("No, the factors do not add to original value");
}
}
}else{
findFactor(returnvalue,divisor);
}
}
else{
findFactor(number,divisor+1);
}
return returnvalue;
}
}
//============================================================
//Program to check if a number is sum of its factors or not
#include <iostream>
using namespace std;
int sumofFactors(int n) {
int i=2;
int sum = 0;
int original = n;
while(n!=1) {
if(n%i==0) {
n = n/i;
sum += i;
i = 2;
}
else i++;
}
return (sum == original);
}
int main(int argc,char **argv) {
int number;
cout<<"Enter a number: ";
cin>>number;
cout<<sumofFactors(number)?"TRUE":"FALSE";
}
//============================================================
<pre lang="" line="1" title="CodeMonkey38712" class="run-this">// Perfect number
// Using trial Division technique
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> factors;
factors.push_back(1);
for(int i=2;i*i<=n;i++){
if(n%i==0){
factors.push_back(i);
factors.push_back(n/i);
}
}
int result=0;
for(int i=0;i<factors.size();i++){
result+=factors[i];
}
if(result==n)
cout<<"Perfect Number"<<endl;
else
cout<<"Not a perfect number"<<endl;
return 0;
}</pre>
<pre lang="" line="1" title="CodeMonkey65333" class="run-this">public void sumFactor (int num) {
int sum = 0;
int max = (int) num/2;
for (int i = 1; i <= max; i++) {
if (num%i==0)
sum += i;
}
if (sum == num) {
System.out.println (num + " is the sum of its factors");
}
}
</pre><pre title="CodeMonkey65333" input="yes">
</pre>
#include<stdio.h>
#include<iostream>
#include<math.h>
int main()
{
int no=0,i=0;
printf("Enter number\n");
scanf("%d",&no);
int sum=1;
int psuedoNo=no;
for(i=2;i<=sqrt(no);i++)
{
if(no%i==0)
{
sum=sum+i+no/i;
}
}
if(sum==no)
printf("PErfect number");
else
printf("Not PErfect number");
system("PAUSE");
}
Complexity O(sqrt(n))
The loop can be optimized:
- AnupamC May 02, 2009for(int i = 1; i <= n/2; i++)