2014-10-09 2 views
0

Моя программа должна отображать все треугольники треугольника между 1-500. Он не должен повторять одни и те же треугольники. Например, 3, 4, 5 совпадает с 4, 3, 5, и должен отображаться только первый. Я также должен иметь счетчик в конце программы, который показывает, сколько треугольников было найдено. Пока это то, что у меня есть. В настоящее время он не отображает правильное количество треугольников, и счетчик работает неправильно. БлагодаряСуществует проблема с моей программой triangle triples

// Naming 

int counter; 

// For loops and nested for loops 

{ 
     // Makes sure side A starts at 1 and is less than 500 
for (int a = 1; a <= 500; a++) 
{ 
     // Makes sure side B starts at 1 and is less than 500 
    for (int b = 1; b <= 500; b++) 
    { 
     // Makes sure side C starts at 1 and us kess than 500 
     for (int c = 1; c <= 500; c++) 
     { 
     // If A squared + B squared = C squared and C squared, A, and B --> 
     // are all less than or equal to 500 then display the answer 
      if ((a*a)+(b*b) == c*c & a & b <= 500) { 
      // This is my counter I cannot seem to get it to work properly 
      // More info about counter at bottom 
      counter++; 
       cout << a << ", " << b << ", " << c << endl; 
      } 
     } 
    } 
} 
} 

cout << endl; 
// Displaying counter 
cout << counter << endl << endl ; 

system("PAUSE"); 
return EXIT_SUCCESS; 
} 
+1

Слишком много циклов: если вы знаете 'a' и' b', вы можете вычислить 'c'. –

ответ

1

Следующая строка не будет делать то, что вы ожидаете:

// If A squared + B squared = C squared and C squared, A, and B --> 
// are all less than or equal to 500 then display the answer 
    if ((a*a)+(b*b) == c*c & a & b <= 500) { 
          ^^^^^^^^^^^^ 

Чанга это на:

if ((a*a)+(b*b) == c*c && a <= 500 && b <= 500) { 

пса: Как далее комментирует @ Code-Ученик, a <= 500 && b <= 500 уже гарантируется for -loop, поэтому его можно упростить до:

if ((a*a)+(b*b) == c*c) { 
+1

Обратите внимание, что условия, в которых 'a <= 500' и' b <= 500', являются избыточными, поскольку это гарантируется счетчиками for. –

+0

@ Code-Apprentice Edited, thx. – herohuyongtao

0

Вы, скорее всего, считаете несколько троек дважды. Если вы проверите свой результат, вы обязательно увидите, что «3, 4, 5» повторяется 6 раз. Фактически, каждые тройной будет повторяться 6 раз. Это говорит о том, что быстрое исправление разделить ваш счетчик на 6.

В качестве альтернативы, вы можете убедиться, что вы не повторять каких-либо тройками, используя внешние петли, чтобы определить начальную точку для внутренних петель:

for (int a = 1; a <= 500; a++) 
{ 
    // Makes sure side B starts at 1 and is less than 500 
    for (int b = a + 1; b <= 500; b++) 
    { 
     // Makes sure side C starts at 1 and us kess than 500 
     for (int c = b + 1; c <= 500; c++) 

ps Кроме того, ошибка в вашем состоянии if гарантирует, что каждые подсчитывается комбинация чисел, поэтому выход 625000000. Обязательно исправьте это, как описано в herohuyongtao's answer.

+0

Хорошо ... но петли не нужны, чтобы найти 'c', просто используйте sqrt. –

+0

@BenVoigt Это, безусловно, достойная оптимизация, как только OP получит правильное решение для начала. –

1

Заставьте свои трои, чтобы их сортировать, прежде чем создавать их. Гипотенуза всегда будет последней, и самая короткая нога всегда будет первой. (Нам не нужно беспокоиться о (a, a, b), так как таких интегральных комбинаций не будет.

Итак, для решения тройки (a, b, c) всегда должно быть верно, что < б < с, а> 0, Ь> 0, с> 0.

Easy. :)

0

счетчик не инициализируется в 0. Где ваша логика, чтобы пропустить как треугольники?

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