20200205 打印沙漏

**

打印沙漏

**

(哈哈哈哈今天是假期的第一天学习 刚刚问了司机 没想到他天天打代码 !偶像啊!)

本题要求你写个程序把给定的符号打印成沙漏的形状。
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
在这里插入图片描述这是PTA上的截图

(别的小朋友一看到题目都想到了等差数列 就我一个傻傻的)

我思考的问题:如何居中输出? 如何输出空格?

下面是主函数体

#include<iostream>
using namespace std;

int fun(int n);
void output(int n,char x,int i);

int main()
{
 int n;
 char x;
 cin>>n>>x;
 
 int i=fun(n);//实现计算功能 返回i 即沙漏首行符号数 
~~// 调试  cout<<i;~~ 
    
 output(n,x,i);//实现输出功能 计算余数 
 
 return 0;
}

(本来我想直接一个函数的 但是后来想想封装性独立性 就写多一个)

下面函数是求出第一行应打印的符号数

int fun(int n)
{
 int a=(n-1)/2;
 int i=1;
 if(a<3&&a>0) ;
 else if(a<8&&a>2) i=3;
 else
 {
     while(a>i)
     {
        i+=2;
        a-=i;
     }
 }
 ~~//调试  cout<<i<<endl;~~  
 return i; 
 }

我一开始while的条件是(a>3) 显然是不对的
(哈哈哈哈哈哈但很神奇过了三个测试点 后来改了还是不对 a的情况没考虑完全 然后我就补锅哈哈哈)

下面是输出函数 我是分开了两半来输出的 一个上三角递减 一个下三角递增 然后余数我是拿了个sum来算用了多少个符号再减出来

void output(int n,char x,int i)
{
  int m=i;
  int sum=0;//沙漏中符号个数 算余数 
  while(m>0)//输出递减 有1 
  {
     if(m<i)//判断是否首末行 否则输出空格使得沙漏居中 
     {
        for(int p=(i-m)/2;p>0;p--)//注意是居中 不是靠右 p要除以2的
        {
           cout<<" ";
        }
     }

    for(int p=m;p>0;p--)//输出符号 
    {
        cout<<x;
    }
   
   cout<<endl;
   sum+=m; 
   m-=2}
   
   m=3; 
 
   while(m<=i)//输出递增 
   {
      if(m<i)//判断是否首末行 否则输出空格使得沙漏居中 
      {
         for(int p=(i-m)/2;p>0;p--)//注意是居中  
         {
            cout<<" ";
         }
      } 
  
     for(int p=m;p>0;p--)//输出符号 
     {
         cout<<x;
     }
  
  cout<<endl;
  sum+=m;
  m+=2;
  }

cout<<n-sum;
 
} 

一定要注意循环的条件判断啊!

然后我就对比了一下给的参考代码 首先很大不同就是运行时间 我的代码费时多了

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
  int x, i, j, n, blank, count;
  char ch;
  
  cin >> n >> ch;
  
  for(count=1, x=1; count+(x+2)*2<=n; count+=(x+2)*2, x+=2);
  //计算可以输出的符号总数(count),以及第一行的符号个数(x) 
  

在计算count的时候 先用 (x+2)代替 最后再x+2
他这样是先把count需要用到的符号数先算出来了 x从3一直+2下去
他的循环的判断条件很好 (哈哈哈哈我的什么鬼)

然后是他的输出

//上半区,含中心点 
  for(i=x, blank=0; i>=1; blank++, i-=2)
  {//i:当前行的符号个数,blank:当前行的行首空格个数 
    for(j=0; j<blank; j++)
      cout << " "; //输出当前行的行首空格 
    for(j=0; j<i; j++)
      cout << ch;    
    cout << endl;//行末空格无需输出 
  }
  
  //下半区,由3个符号开始输出 
  for(i=3, blank-=2; i<=x; blank--, i+=2)
  {
    for(j=0; j<blank; j++)
      cout << " ";
    for(j=0; j<i; j++)
      cout << ch;
    cout << endl;
  }
  
  cout << n-count << endl; //输出剩余空格 
  
  return 0;
}

输出感觉跟我的差不多 但他写得好简洁啊
(还有就是原来那个1叫做中心点啊哈哈哈)

(好了 美好的一天就这么过去了 我要去看电视了)
(不喜欢打代码的小朋友今天有更喜欢打代码了吗)

发布了2 篇原创文章 · 获赞 0 · 访问量 78

猜你喜欢

转载自blog.csdn.net/wasabidragon/article/details/104186550