2012-03-10 58 views
0

只要l是1,h就可以是任何數字,此循環就可以工作。但我需要它從不同的範圍工作,如l = 20 h = 40?誰能告訴我該怎麼做?我將不勝感激。不能製作嵌套循環

#include <iostream> 
#include <vector> 
#include <list> 
#include <math.h> 
#include <algorithm> 


using namespace std; 

int main(void) 
{ 
    int a, b, c, i = 0; 
    unsigned long l = 1; 
    unsigned long h = 25; 
    int array[3]; 

    for (a = l; l <= a && a <= h; ++a) 
     for (b = a; l <= b && b <= h; ++b) 
      for (c = b; l < c && c <= h; ++c) 
       if (a * a + b * b == c * c) 
       { 
        array[0] = a; 
        array[1] = b; 
        array[2] = c; 

        if (array[0]+array[1]+array[2] <= h) 
         cout << array[0] << " " << array[1] << " " << array[2] <<endl; 
        else 
         break; 
       } 
    return 0; 
} 
+4

縮進你的代碼。你不會後悔的。 – Blender 2012-03-10 03:56:34

+2

我看到的第一件事情是錯誤的(除了縮進),你是愉快地將'unsigned long'轉換爲'int'而不需要進一步提問。這可能不是問題,但這仍是一個問題。 – netcoder 2012-03-10 04:01:12

+0

@ user1219733,如果您在解決問題的堆棧溢出中得到答案,請接受它們爲「接受」。這是通過點擊答案分數下的複選標記完成的。 – Shahbaz 2012-03-17 19:41:51

回答

2

有一些有趣的這一行,我不能告訴你正在試圖做...

for (a = l; l <= a && a <= h; ++a) 

所以,在第一輪a=la++,條件是選中l<=aa將是l+1,這意味着l<=l+1,所以你將在第一次後退出你的循環。我懷疑這不是你想要的行爲,但我真的不知道你想要什麼。我可以推測你想要的東西是這樣的:

for (a = 0; l <= a && a <= h; ++a) 

編輯:從您的意見,我可以看到你正在嘗試做的,這應該更好地工作。基本上,你不需要有較低值的條件,這是你問題的根源。另外,我不明白爲什麼你懶得把值寫入一個數組,每次寫入數組,所以我刪除了它。

for (a = l; a <= h; ++a) { 
    for (b = a; b <= h; ++b) { 
     for (c = b; c <= h; ++c) { 
      if (a * a + b * b == c * c) { 
       if (a+b+c <= h) { 
        cout << a << " " << b << " " << c <<endl; 
       } 
       else { 
        break; 
       } 
      } 
     } 
    } 
} 
+0

其畢達哥拉斯三元組,並從1-100工作正常,但不能做範圍40 - 60 – user1219733 2012-03-10 04:17:22

+0

@ user1219733:啊,這是有道理的。你很接近,我的編輯現在確切地告訴你你做錯了什麼,這與我最初的懷疑是一樣的('l <= a'是什麼錯誤) – PearsonArtPhoto 2012-03-10 04:34:29

0

在第一循環中的條件將是第一次,因爲升虛假>一

1

我認爲一個問題是在你的第三個循環,這是與其他兩個略有不同:

for (c = b; l < c && c <= h; ++c) { 

在第一遍,a == 1b == 1l == 1所以c被設置爲1,並l < c評估爲假,所以內循環不執行。

你真的不需要測試你的下界(前面的循環中的l < cl <= b等),因爲你從設置它們的方式知道條件應該是真的,除非你犯了一個錯字條件。

規範形式爲一個在C++循環爲:

for (int i = lo; i < hi; ++i) 

一個合適的類型(int這裏),索引變量(i)從下限lo上升但不包括上限hi。這也適用於C99,但不適用於C89。如果循環完成後需要循環索引的值,那麼可能在以更大的範圍聲明該變量,而不僅僅是循環,如圖所示,但您通常會避免這樣做。 (我在評論中使用了i++,因爲我是一個未改編的C程序員,但在C++中的預增量總體上更好。)

3

如果我理解你的權利,你要猜解Diophant的系統

  • A^2 + B^2 = C^2
  • A + B + C <^h

這是溶液

#include <iostream> 

using namespace std; 

int main() { 
    const int l = 1; 
    const int h = 25; 
    for (int a = l; a <= h; ++a) 
     for (int b = l; b <= h; ++b) 
      for (int c = l; c <= h; ++c) 
       if ((a * a + b * b == c * c) && 
        (a + b + c <= h)) 
         cout << a << " " << b << " " << c <<endl; 

    return 0; 
} 

輸出爲:

3 4 5 
4 3 5 
6 8 10 
8 6 10 

如果您不需要區分A和B,第二個週期可能是

for (int b = a; b <= h; ++b) 

所以你會得到這樣的:

3 4 5 
6 8 10 
+1

你的意思是「暴力」,對吧? :) – netcoder 2012-03-10 05:27:20

+0

Thx,並隨意編輯:)我不是母語的人 – 2012-03-10 05:32:42