打印菱形

    接着昨天的倒计时,今天写了一个菱形的算法。题目:输入一个菱形的高n(必须为奇数),即行数,也是正中间行的星号个数,打印用星号组成的菱形。如下图,高为9的菱形:


    看到此题,想到的第一个方法就是先打印上半部分,再打印下半部分。这个仔细观察,就能找到规律,写出来不难。后来想能否不分上下部分,直接for循环,从1到n,一次性全部打印出来。主要是想把上下部分的打印程序整合在一起,相当于都调用同一个带参数的函数即可。最后也没想到什么好方法,就从每行的前半部分空格和后半部分星号开始思路。

    前半部的空格都好应付。空格个数在上半部分从n/2减到0,再从下半部分的0增加到n/2。空格个数与行数i的关系分别是:(n+1)/2-i和i-(n+1)/2。

    后半部的星号个数都是上半部分每行加2,加到n;然后下半部分逐行再减2,减到1。经过分析,星号个数与行数i的关系分别是:2*i-1和n-2*(i-(n+1)/2)。主要是下半部分的公式看上去比较复杂,其实可以从两个角度来理解(设m=(n+1)/2,即正中间的行数。)。

    一、垂直对称法。这里每行都可以理解为打印n个字符,中间是星号,两边是同等个数的空格,即对称于竖直的对角线,也就是垂直对称。上面已分析出空格数与行数的关系是i-m,所以中间的星号是总的字符数n,再减去两边的空格数2*(i-m),即n-2*(i-m)。

    二、叠加相减法。每行中,前面空格数加上后面星号数的打印总数s,是不是从n开始在逐行递减(以-1为增量)?每行打印总数s与n,是不是存在一个这么的关系:s=n-(i-m),即n减去每行的空格数?星号总数,也就是打印总数s减去每行的空格数了,即s-(i-m)=n-2*(i-m)。

    代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>

int main(int argc, char **argv) 
{
	UCHAR n=9;
	UCHAR m,a,b,i,j;

	if(n%2 == 0)
		return -1;
	m=(n+1)/2;
	for(i=1; i<=n; i++){
		if(i < m){
			a = m-i;
			b = 2*i -1; //a+b = m+i-1
		}else{
			a = i-m;
			b = n-2*(i-m); //a+b = n-(i-m)
		}
		for(j=1; j<=a; j++)
			printf(" ");
		for(j=1; j<=b; j++)
			printf("*");
		printf("\n");
	}
	
	system("pause");
}


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值