2016-09-20 5 views
0

Я пытался заставить это работать в течение нескольких дней, и я до сих пор не могу понять ошибку. Когда я выводю код, он печатает, но он не найдет дружественных пар (делитель first == second и наоборот).C ошибка программы - вывод 0

#include <stdio.h> 
#include <stdlib.h> 
#define _USE_MATH_DEFINES 
#include <math.h> 

int sumDivisors(int num); 

int sumDivisors(int num) 
{ 
    int counter, total; 
    for(counter = 1; counter < num; counter++) 
    { 
     if(num % counter == 0) 
     { 
      total += counter; 
     } 
    } 
    return (total); 
} 

int main(void) 
{ 
    int higher, lower, lowx, lowy, x, y, numOfPairs = 0; 

    printf("This program finds all amicable numbers within a range. \n"); 
    printf("Please enter a lower limit: \n"); 
    scanf("%d", &lower); 
    printf("Please enter a higher limit: \n"); 
    scanf("%d", &higher); 


    for(lowx = lower; lowx <= higher; lowx++) 
    { 
     for(lowy = lower; lowy <= higher; lowy++) 
     { 
      if(sumDivisors(lowx) == sumDivisors(lowy)) 
      { 
       numOfPairs++; 
       printf("Pair #%d: (%d, %d)\n", numOfPairs, lowx, lowy); 
      } 
     } 
    } 

    printf("There are %d amicable pairs from %d to %d\n", numOfPairs, lower, higher); 
    system("pause"); 
    return (0); 
} 
+0

Рассмотрим написание внутренний цикл как 'для (Lowy = lowx + 1; Лоуи <= выше; Лоуи ++)', чтобы избежать повторений. –

+0

Хорошая точка, она делает ее более эффективной. Благодаря! – Submersed24

+0

При дальнейшем мышлении вы можете неверно истолковать определение дружественных чисел, которые являются [двумя разными цифрами, так что сумма соответствующих делителей каждого равна другому числу] (https://en.wikipedia.org/ вики/Amicable_numbers). Вы можете найти список первых пар в [OEIS - A063990] (http://oeis.org/A063990). Посмотрите на это [Q & A] (http://stackoverflow.com/a/28268160/4944425) для более интересной оптимизации. –

ответ

6

Вы не назначая никакой ценности всего в вашем коде:

int sumDivisors(int num) 
{ 
    int counter, total; 
    for(counter = 1; counter < num; counter++) 
    { 
     if(num % counter == 0) 
     { 
      total += counter; 
     } 
    } 
    return (total); 
} 

поэтому она содержит мусор не предсказуемое значение!

она должна быть как: int counter, total = 0;

+1

О, черт возьми ... спасибо .. вы меня спасли.Я использую null нулевой – Submersed24

+0

@ Submersed24 Что это должно делать с нулевым равным нулю? – immibis

+0

Раньше я думал, что переменные по умолчанию равны 0, поэтому вам не нужно устанавливать их в ноль – Submersed24

Смежные вопросы