2016-10-26 3 views
0

Хотим посчитать, сколько пара натурального числа есть такие, что в + B = с . В качестве ввода моей функции у меня есть c.Сумма разложения двух квадратов подсчета

Моя идея состояла в том, чтобы в первую очередь проверить, выполнено ли условие, а если нет, я хотел бы, чтобы цикл повторял желаемое выражение до c. Если результат равен квадрату c, то я хотел бы иметь count++. Вопрос в том, почему это не работает?

Некоторые исправления добавлены.

int sum(int c) { 
    int b=1; 
    int a=1; 
    int count=0; 
    int result; 

    if (a*a + b*b != c*c) 
    { 
     for (int i=1; i<=c; i++) 
     { 
      b=i; 
      result = a*a + b*b; 
      if (result == c*c) 
       count++; 
     } 
     a++; 
    } 
    else 
     count++; 

    return count; 
} 

Проблема в том, что я до сих пор не понимаю, почему это не хочет работать.

Моя вторая идея состояла в том, чтобы подойти к нему с время цикла:

int sum(int c) { 
    int b=1; 
    int a=1; 
    int count=0; 
    int result; 

    if (a*a + b*b != c*c) 
    { 
     while(b<=c) 
     { 
      result = a*a + b*b; 
      if (result == c*c) 
       {count++; 
       b++; 
       } 
       else 
        b++; 
     } 
     a++; 
    } 
    else 
     count++; 

    return count; 
} 

Не работает, как хорошо.

У кого-нибудь есть идеи относительно того, как заставить его работать? Любая из этих двух версий? Может, намеки?

+0

<= c в вашей петле для петли? –

+0

Зачем тратить время на 'a * a', когда вы никогда не меняете значение' a' с '1'? – Gavin

+0

Вы исправите это с помощью [отладчика] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) - пройдите через код, посмотрите на переменные, и вы поймете как все работает, когда вы закончите. – UKMonkey

ответ

2

Проблема в том, что вы используете if, ожидая, что он будет работать как цикл. В нижней половине if вы делаете приращение a, тем не менее, так как это if, а не while или for, оно не подпрыгивает вверх.

Необходимо изменить как a, так и b, поэтому вам нужен цикл для управления каждым из них.

for (a=1; a<=c; a++) { 
    for (b=a; b<=c; b++) { 
     if (a*a + b*b == c*c) { 
      count++; 
     } 
    } 
} 

Обратите внимание, что b начинается с текущим значением a вместо 1. Таким образом, вы не пытаетесь той же пара чисел (как раз переключил) дважды.