码迷,mamicode.com
首页 > 其他好文 > 详细

打印沙漏

时间:2016-12-04 23:21:53      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:格式   code   中间   return   blog   ...   通过   组成   can   

题目描述:

  

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

 题解基础嵌套for循环变形,难点在于运用肉眼观察法找出符号*的总数N和每行按等差数列1,3,5...分布的数字前n项和Sn的规律

即:

Sn = n*n;

Tn = 2Sn -1;

通过此关系式在代码中逆向推出n的范围以及剩余符号res的值

还有一个注意点是单行*只需要输出一次,打印沙漏下方的时候要注意空格和行数的关系

 1 #include<stdio.h>
 2 int main()
 3 {
 4     char c;
 5     int N;
 6     int n;
 7     scanf("%d %c",&N,&c);
 8     //寻找小n的值
 9     if(N<7)
10         n = 1;
11     else
12     {
13     for(int i=1;i<N;i++)
14     {
15          if(2*i*i-1>N)
16          {
17              n = i-1;
18              break;
19          }
20     } 
21     }
22     //循环打印
23     int res = N-(2*n*n-1);
24     for(int i=n;i>0;i--)
25     {
26         for(int k=i;k<n;k++)
27         {
28             printf(" ");
29         }
30         for(int j=2*i-1;j>0;j--)
31         {    
32             printf("%c",c);
33         }
34         
35         printf("\n");
36         
37     }
38     
39     for(int i=0;i<n-1;i++)
40     {
41         for(int j=i;j<n-2;j++)
42         {
43             printf(" ");
44         }
45         for(int k=0;k<2*(i+2)-1;k++)
46         {
47             printf("%c",c);
48         }
49         printf("\n");
50     }
51      printf("%d\n",res);
52     
53 return 0;    
54 } 

 

打印沙漏

标签:格式   code   中间   return   blog   ...   通过   组成   can   

原文地址:http://www.cnblogs.com/valar/p/6132259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!