2015-09-07 63 views
0

我們被要求做一個三角形編號。模式在C + +最小。循環。三角形圖案如下:在C++中用最小循環創建數字模式(三角形數字)

____1_____ 
___2__3____ 
__4__5__6__ 
7__8__9__10 

我的代碼:

#include <iostream> 

using namespace std; 
int main() { 
    int n=0, r=0, i=0; 
    cout << "No. of rows: "; 
    cin >> r; 

    for(n=1; n<=r; n++) { 
     for(i=1; i<=r-n; i++) { 
      cout << " "; 
     } 
     for(i=(n*(n-1)/2)+1; i<=(n*(n+1)/2); i++) { 
      if(i<10) 
       cout << " " << i << " "; 
      else 
       cout << i << " "; 
     } 
     cout << "\n"; 
    } 
    return 0; 
} 

OUTPUT

enter image description here

質詢

1)使用模式生成公式是否明智?例如,爲了把i的值放在最後一個循環中,我使用公式1,2,4,7 ..作爲(n *(n-1)/ 2)+1。這樣更有效率嗎?什麼可能是迭代的方法?和什麼可能是遞歸一個?

2)是否可以減少no。循環?減少變量或減少循環會更好嗎?

謝謝!

+0

「是能夠更好地減少變量或減少循環?」個人資料,請參閱 –

+0

@ChrisBeck我們如何分析? –

+0

@TimKrul,當然使用探查器!例如,您可以使用_gprof_。 – ForceBru

回答

2

這是一個完全個人的觀點,但我認爲使用公式不會影響效率,因爲您無論如何一次只能打印一個元素。所以總時間取決於你的輸入長度是r(r+1)/2

我寫了這個,它似乎也能很好地工作,雖然這段代碼中的邏輯是保持按順序打印元素並在需要時打破這一行。它只使用一個內部循環來打印每行開始處的空格。這是Ideone link

int r; 
cin>>r;        //number of rows 
int spaces = r-1, rowcount = 1; 
int curcount = 0; 

for(int i=1; i<=(r*(r+1))>>1;i++) { 

    if(curcount == 0) { 
     for(int j=0; j<spaces; j++) 
      cout<<" "; 
     spaces--; 
    } 

    cout<<(i<10?" ":"")<<i<<" "; 
    if(++curcount == rowcount) { 
     rowcount++; 
     curcount=0; 
     cout<<endl; 
    } 
} 
3
  1. 它是一種簡單的遞增的數字金字塔該劑量並不需要任何特殊的配方。由於涉及更多計算,公式會增加程序的複雜性。儘量保持代碼簡單。
做到這一點

簡單的方法是:

int main() { 
int num,i=1; 
cout<<"Enter Number of Rows"; 
cin>>num; 
for(int r=1; r<=num; r++) 
{ 
    for(int space=1; space<=num-r; space++){ 
    cout<<" "; 
    } 
    for(int c=1; c<=r; c++,i++){ 
    cout<<" "<<i; 
    } 
    cout<<"\n"; 
} 
    return 0; 
}