打印沙漏

问题描述

    当n=5时,沙漏图形如输出样例所示。请观察并明确沙漏图形的规律。要求输入一个整数n,输出满足规律的沙漏图形。

 输入:

    测试数据有多组,处理到文件尾。每组测试输入一个整数n(1<n<20)。

 输出:

    对于每组测试,输出满足规律的沙漏图形。

 输入样例:

5

 输出样例:

*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********

代码:

#include<stdio.h>

int main(){
	int i,j,k,n,l,s,c;
	while(scanf("%d",&n)==1){
    l=2*n-1;
	s=l;
	c=0;
	for(j=0;j<n;j++){
		for(k=c;k>0;k--){
				printf(" ");
			}
		c++;
		for(i=0;i<s;i++){
			printf("*");
		}
		printf("\n");
		s=s-2;	
	}
	s=s+2;
	for(j=0;j<n-1;j++){
		for(k=c-2;k>0;k--){
				printf(" ");
			}
		c--;
		s=s+2;
		for(i=0;i<s;i++){
			printf("*");
		}
		printf("\n");
	}
    }
	return 0;
}

### 回答1: 当 n=5 时,沙漏图形如下: ``` * *** ***** ******* ********* ******* ***** *** * ``` 规律:沙漏图形是由若干行等差数列组成的。每行的星号数量为 2n-1, 2n-3, ..., 3, 1,第一个数和最后一个数的数量相等,在图形中间是对称的。输入整数 n,可以根据这个规律输出沙漏图形。 ### 回答2: 沙漏图形规律如下: 1. 每行星号数量递减(或递增)2个; 2. 一半行数为(n+1)/2。 根据这个规律,我们可以分为上半部分和下半部分,上半部分先输出n行,下半部分输出(n-1)行。 具体实现时,可先确定最中间一行上的星号数量,即2*(n/2)+1,再向两边递减(或递增)2个星号,输出上半部分。下半部分同理,从上半部分的下一行开始到最下一行,向两边递增(或递减)2个星号,输出即可。 以下是可参考的Python代码实现: ```Python n = int(input()) # 输入沙漏图形的大小 # 输出上半部分 for i in range((n+1)//2): stars = 2*i + 1 # 星号数量 spaces = (n - stars) // 2 # 空格数量 print(' ' * spaces + '*' * stars) # 输出行 # 输出下半部分 for i in range((n-1)//2): stars = 2*((n-1)//2 - i) + 1 # 星号数量 spaces = (n - stars) // 2 # 空格数量 print(' ' * spaces + '*' * stars) # 输出行 ``` ### 回答3: 在沙漏图形中,中间那一行是数字连续递减的,每往上或往下一行,数字递增或递减2,即上(下)一行的数字比下(上)一行少(多)2。因此,数字递减到1后再开始递增,直到n为止。 沙漏的行数为2n-1,前n行数字由大到小递减2,再由小到大递增2,后n-1行数字由小到大递减2,再由大到小递增2。中间那一行数字为n。 下面给出代码实现: ```python n = int(input()) # 输入一个整数n line_num = 2 * n - 1 # 沙漏的行数 for i in range(line_num): # 上半部分 if i < n: num = n - i # 第i行的数字 space_num = i # 输出数字前面的空格数 # 下半部分 else: num = i - n + 2 space_num = line_num - i - 1 # 输出空格和数字 print(' ' * space_num + str(num) * (2 * (n - abs(num)) - 1)) ``` 输出结果如下: 输入:5 ``` 11111 222 33333 444 55555 ``` 输入:6 ``` 111111 22222 3333333 44444 5555555 66666 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值