题目:输出行列都相等的菱形,如5行5列:
行列 12345
1 *
2 ***
3 *****
4 ***
5 *
分析:
当行数等于总行数的一半时,*是递增的,递增为2。
当行数大于总行数的一半时,*是递减的,递增为2。
设有一个行列为n的菱形,
我们用变量i作为行数,以0开始,i
k作为n菱第i行要输出的*个数。
则i<=n的中值用m表示,m=n-1 i="">m时,k递减。
因为k相对于m行对称,所以:
当i>m时,i每增加i-m时的k值就和第m-i行的k值相等,即第i-m行和第m-i-m相对称。
所以得出结果:
当i<=m时,k=2i+1
当i>m时,k=2m-i-m+1,m=n-1/2。即k=2n-2i-1
由于我们只需要输出*左边的空格即可,所以每行*左边的空格的个数为:n-每行的k/2。
每行循环输出空格,再循环输出每行的*,再输出回车,结束一行。
这样我们就可以开始编程了。
#include
int main
int i,j,k,n;//定义四个变量:i是行,j每行*号前的空格数,k每行的*号数
printf"please input odd n:";
scanf"%d",&n; //输入奇数n
for i=0;i
ifn>=2*i+1 //判断k值
k=2*i+1;
else
k=2*n-2*i-1;
forj=n-k/2;j>0;j-- //循环输出空格
printf" ";
for;k>0;k-- //循环输出*号
printf"*";
printf"n"; //输出回车结束一行
本来呢题目就到止结束了,但上面的程序还不够完美
比如说,别人输入n值为偶数怎么办?输入非数值呢?
我们加一点东西进去:
#include
int main
int i,j,k,n=0; //这里给n赋初值,即使输入非数值,n也可有确切的值。
do //增加一个大循环,可以令n可以输入多次以观察不同的结果。
printf"please input odd n, 0 to exit:";//当输入0的时候,退出大循环,结束程序。
scanf"%d",&n;
if !n%2 //增加对输入偶数的判断。
printf"you input a even, please input again.n";
continue;
for i=0;i
ifn>=2*i+1
k=2*i+1;
else
k=2*n-2*i-1;
j=n-k/2;
for;j>0;j--
printf" ";
for;k>0;k--
printf"*";
printf"n";
whilen;
return 0;