2020-11-19

打印菱形(C语言版)循环版

问题描述
从键盘输入正整数n(2<=n<=9),要求输出由数字组成的菱形图案
输入描述
一个正整数n(2<=n<=9)
输出描述
由数字组成的菱形图案
样例输入
4
样例输出

   1
  121
 12321
1234321
 12321
  121
   1

对于此题,我们的要解决的问题有两个:1、空格如何从上到下先减再增;2、数字如何从左到右先增再减。且我们对于数字后面的空格只需用换行解决。
我们来观察一下样例输出,空格从第一行的3哥到第四行的0个再到第七行的3个,这个数字3等于4-1,归纳一下,空格是从第一行的n-1个到第n行的0个再到第2n-1行的n-1个;数字第一行只有1,第二行从1到2再到1,第三行从1到3再到1,第四行从1到4再到1,第五行与第三行一样,第六行与第二行一样,第七行于第一行一样,归纳一下,第一行只有1,第二行从1到2再到1,依次类推,第n行是从1到n再到1,第n+1行到第2n-1行与第1行到第n-1行顺序相反,所以,数字是从1到“行数”再到1。
最后我们只要将此图形拆分一下,分为上n行与下n-1行,将空格、数字、换行交替输出就好。
以下是源码:

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	int m=n;// 用m代替n进行迭代循环 
	if(2<=n&&n<=9){
		int i,j;
		for(i=1;i<=n;i++){//准备打印前n行 
			for(j=1;j<=m-1;j++) printf(" ");//先打印n-1个空格,然后空格以1递减 
			m--;
			for(j=1;j<=i;j++) printf("%d",j);//打印数字从1到行数 
			for(j=i-1;j>=1;j--) printf("%d",j);//打印数字从行数-1到1 
			printf("\n");//一行结束,换行, 
		}//此时m=0 
		for(i=n-1;i>=1;i--){//准备打印后n-1行,注意此时i的初始值是n-1 
			for(j=1;j<=m+1;j++) printf(" ");//先打印一行,然后空格以1递增 
			m++;
			for(j=1;j<=i;j++) printf("%d",j);//打印数字从1到行数
			for(j=i-1;j>=1;j--) printf("%d",j);//打印数字从行数-1到1
			printf("\n");//一行结束,换行,
		}
	}
	return 0;
}

当然,我们也可以简洁一下代码,用绝对值来表示行数,这样就不用拆分了。

#include <stdio.h>
#include<math.h>
int main()
{
	int n,i,j,k,cnt=0;
	scanf("%d",&n);
	if(2<=n&&n<=9){
		for(i=1-n;i<=n-1;i++){
			for(j=1;j<=fabs(i);j++)	printf(" ");
			for(k=1;k<=n-fabs(i);k++)	printf("%d",k);
			for(k=n-fabs(i)-1;k>=1;k--)	printf("%d",k);
			printf("\n");
		}
	}
	return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值