Solving Perfect Number Program in C

  • Thread starter Thread starter Dili
  • Start date Start date
AI Thread Summary
The discussion revolves around writing a C program to determine if a number is perfect, with examples like 6 and 28. An initial code snippet was provided but contained errors in variable initialization and parentheses placement. A corrected version was shared, emphasizing proper logic and variable initialization. Additionally, an alternative, faster implementation using the Euclid identity for perfect numbers was introduced, showcasing a more efficient algorithm. The conversation also touched on the difference between return values in C, where return 0 indicates normal termination and return 1 indicates an error. Overall, the focus was on improving the program's functionality and understanding C programming concepts.
Dili
Messages
13
Reaction score
0
I need to write a program to check whether a number is perfect
eg: 6=1+2+3 , 28=1+2+4+7+14
i wrote one, but it doesn't work. also I've seen programs written with different preprocessors, we are required to write it on stdio.h and math.h


#include<stdio.h>
#include<math.h>

int main()
{
int a,b,c,d,i;
scanf("%d",&a);
{
for(i=1;i<a;i++)
b=a%i;
if(b==0)
{
c=0;
c=c+i;
}
if(c==a)
printf("perfect\n");
}
return 1;
}

 
Technology news on Phys.org
Few mistakes in variable initialization and placing of parentheses. Here is the modified correct version. Make sure you understand the logic.

#include<stdio.h>
#include<math.h>

int main()
{
int a,b,c,d,i;
scanf("%d",&a);c=0;
for(i=1;i<a;i++)
{
b=a%i;
if(b==0)
{
c=c+i;
} }
if(c==a)
printf("perfect\n");
return 1;
}
 
Heh. Here's a version you can't turn in, but which is far faster; it uses the Euclid identity of perfect numbers.

Code:
#include<stdio.h>
#include<math.h>

int is_prime(n) {
  int i,root;
  if (!(n&1))
    return n == 2;
  if (n%3 == 0)
    return n == 3;
  if (n < 25)
    return n > 1;
  root = (int)sqrt(n);
  for (i = 5; i <= root; i += 6)
    if (n%i == 0 || n%(i+2) == 0)
      return 0;
  return 1;
}

int main() {
  int even_part, odd_part;
  scanf("%d",&odd_part);
  even_part = 1;
  while (!(odd_part&3)) {
    odd_part = odd_part >> 2;
    even_part = even_part << 2;
  }
  if (!(odd_part&1)) {
    odd_part = odd_part >> 1;
    even_part = even_part << 1;
  }
  if (even_part << 1 == odd_part + 1 && is_prime(odd_part))
    printf("perfect\n");
  return 0;
}

Even faster and even cheatier, for 32-bit machines:

Code:
int main() {
  int n;
  scanf("%d",&n);
  if (n == 6 || n == 28 || n == 496 || n == 8128 || n == 33550336)
    printf("perfect\n");
  return 0;
}
 
Last edited:
Thank you very much arunbg. I am not good at C programming.
I do now understand the placing of brackets and c=0.
If no bother can you explain what is the difference between return 1 and return 0
Ive used them but with no real understanding
Thanks again
 
int main() {
int n;
scanf("%d",&n);
if (n == 6 || n == 28 || n == 496 || n == 8128 || n == 33550336 || n == 8589869056)
printf("perfect\n");
return 0;
}
Lol...nice one.
 
Dili said:
If no bother can you explain what is the difference between return 1 and return 0
Ive used them but with no real understanding

Don't worry about it. These are error codes that the program returns, but they won't display or do anything unless they're checked by an outside program. 0 is supposed to mean "terminated normally" and anything other than 0 is supposed to mean "terminated with some kind of error".
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...
Back
Top