Question

I'm trying to write a code in C which would allow a maximum input of 10 elements (natural numbers) in an array, identify all perfect numbers in the array, and do the product of all non-perfect numbers.

Euclid proved that 2^{p−1}(2^p−1) is an even perfect number whenever 2^p−1 is prime (Euclid, Prop. IX.36). For example, the first four perfect numbers are generated by the formula 2^{p−1}(2^p−1), with p a prime number, as follows: for p = 2: 2^1(2^2−1) = 6 for p = 3: 2^2(2^3−1) = 28 for p = 5: 2^4(2^5−1) = 496 for p = 7: 2^6(2^7−1) = 8128. (source: wikipedia)

When I compile the program, I get a triplicate or higher repetition of declaration of the perfect number.

e.g.:

... t[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 6}

'6' is a perfect number. '6' is a perfect number. '6' is a perfect number. ...

I also get a weird products.

e.g.:

... t[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 28}

'28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. '28' is a perfect number. ... The product of the non-perfect numbers is -1677721600

I'm really new to c, I can't seem to figure out what I'm doing wrong, but I wouldn't an handout either. Some guidance would be much appreciated.

#include <stdio.h>
#define MAX_BOUND 9  /*Array's bound*/

main() {

int i, /*array index*/
    t[i],
    d, /*divider*/ 
    sum, /*result for perfect number validation*/
    product; /*product of all non-perfect number in array*/

i = 0;

printf("Enter your natural numbers. \n");

for (i = 0; i <= MAX_BOUND; i++) {
printf("Number %d : ", i + 1);
scanf( "%d", &t[i]);
}

i = 0;
product = 1;
for (i = 0; i <= MAX_BOUND; i++) {   
    d = 1;
    sum = 0;
    while(d < t[i]) {
        if(t[i]%d == 0)
        sum = sum + d;
        d++;

            if(sum == t[i])
            printf("%d is a perfect number. \n", t[i]);
            else
            product = product * t[i];
    }
}  
printf("The product of the non-perfect numbers is %d \n", product);
getch();
}
Was it helpful?

Solution 2

In your declaration of the array, you have undefined behaviour because you used the wrong size:

main() {

    int i, 
        t[i],
        d, /*divider*/ 
        sum, 
        product;

    i = 0;

    printf("Enter your natural numbers. \n");

    while (i <= 9) {
        printf("Number %d : ", i + 1);
        scanf( "%d", &t[i]);
        i++;
    }

You probably meant to declare

t[MAX_BOUND+1];

(MAX_BOUND would be wrong, since you use the element t[MAX_BOUND]).

At the point where t is declared, i has indeterminate value (not unlikely to be 0).

With indeterminate array size, the accesses t[i] produce yet more indeterminate values (and again are undefined behaviour if i >= sizeof t / sizeof t[0]).

The printing part,

        if(sum == t[i])
        printf("%d is a perfect number. \n", t[i]);
        else
        product = product * t[i];

should be moved after the loop used to determine the divisor sum. With that inside the loop, you multiply product with t[i] a total of t[i] - 1 times (or t[i] - 2 if one of the intermediate sums equals t[i]) if t[i] is not perfect, and t[i]/2-1 times if t[i] is perfect. Also, you print t[i]/2 times for perfect numbers, and once for abundant numbers if one of the intermediate sums equals t[i] (I'm ignoring the theoretical possibility of odd perfect numbers, if there are any, they are far too large for int).

Doing that produces correct output here.

OTHER TIPS

"Weird product" (for example negative) is caused by integer overflow. Your product is int, make it bigger, long long for example.

You should use for loops with i, not while. Code checking if a number is perfect should be placed in the separate function bool isPerfect(int number).

You meant sum = 0, not somme = 0. Declaration t[i] is also wrong.

Corrected version (compile with gcc -std=c99 file.c):

#include <stdio.h>
#include <stdbool.h>
#define MAX 10

int t[MAX];

bool isPerfect(int number)
{
    int sum = 0;
    for (int d = 1; d < number; ++d) // optimization: you can iterate until sqrt(number)
    {
        if (number % d == 0)
        {
            sum += d;
        }
    }
    return sum == number;
}

int main()
{
    printf("Enter your natural numbers. \n");
    for (int i = 0; i < MAX; ++i)
    {
        printf("Number %d: ", i + 1);
        scanf("%d", &t[i]);
    }
    long long product = 1;
    for (int i = 0; i < MAX; ++i)
    {
        if (isPerfect(t[i]))
        {
            printf("%d is a perfect number. \n", t[i]);
        }
        else
        {
            product = product * t[i];
        }
    }
    printf("The product of the non-perfect numbers is %lld \n", product);
    return 0;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top