使用最少的循环在c ++中创建数字模式(三角形数字)

时间:2015-09-07 14:16:44

标签: c++ loops iteration

我们被要求制作一个三角形的号码。 c ++中的模式与min。循环。三角形模式如下:

____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;
}

输出

enter image description here

问题

1)使用模式生成公式是明智的吗?例如,为了将i的值放在最后一个循环中,我使用模式 1,2,4,7 .. 作为(n *(n-1)/ 2) 1 即可。这种方式更有效吗?什么可能是迭代方法?什么可能是递归一个?

2)是否可以减少否。循环?减少变量或减少循环是否更好?

谢谢!

2 个答案:

答案 0 :(得分:3)

  1. 它是一个简单的增量数字金字塔,不需要任何特殊配方。公式增加了程序的复杂性,因为涉及更多的计算。尽量保持代码简单。
  2. 最简单的方法是:

    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;
    }
    

答案 1 :(得分: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;
    }
}