题目是这样的,如下图:
第一种方法:
一开始想到的方法就是使用两个嵌套循环分别打印上面的正三角形,和剩下的倒三角形,i控制行,j控制列,代码实现如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int i,j,n,t;
cin>>n;
t=2*n-1;
//打印上面正三角
for(i=0;i<=n;i++){
for(j=n;j>i;j--){
cout<<" ";
}
for(j=0;j<2*i+1;j++){
cout<<"*";
}
cout<<endl;
}
//打印下面倒三角
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
cout<<" ";
}
for(j=0;j<t;j++){
cout<<"*";
}
t-=2;
cout<<endl;
}
return 0;
}
输入n为5运行效果:
第二种方法:
后面想着能不能用一个循环嵌套直接打印出菱形呢?观察了下菱形的各个星号点的位置,总结了下规律,可以使用4个一元一次方程限制星号的范围,列出菱形4条边长星号的坐标位置,这里以输入n为2,边长为3的菱形为例(如下图)
左上角直线3个点坐标(1,3),(2,2),(3,1),
右下角直线3个点坐标(3,5),(4,4),(5,3),
右上角直线3个点坐标(1,3),(2,4),(3,5),
左下角直线3个点坐标(3,1),(4,2),(5,3)。
由直线的一般方程y=k*x+b可求出y与x、n的关系式,进而可得出菱形四条直线需要满足的条件分别为:
x+y>=n+2
x+y<=3*n+2
y-x<=n
x-y<=n
好家伙,还是得把数学捡起来!代码实现如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
int x,y,n;
cin>>n;
for(x=1;x<=2*n+1;x++){
for(y=1;y<=2*n+1;y++){
if(x+y>=n+2 && x+y<=3*n+2 && x-y<=n && y-x<=n){
cout<<"*";
}else{
cout<<" ";
}
}
cout<<endl;
}
return 0;
}
搞定!代码量明显比第一种方法简洁很多,运行效果如下:
实现打印菱形的方法有多种,欢迎大家一起交流方法和心得,有不准确的地方也欢迎大家指正~