我们被要求制作一个三角形的号码。 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;
}
输出
问题
1)使用模式生成公式是明智的吗?例如,为了将i的值放在最后一个循环中,我使用模式 1,2,4,7 .. 作为(n *(n-1)/ 2) 1 即可。这种方式更有效吗?什么可能是迭代方法?什么可能是递归一个?
2)是否可以减少否。循环?减少变量或减少循环是否更好?
谢谢!
答案 0 :(得分:3)
最简单的方法是:
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;
}
}