当前位置:   article > 正文

PTA团体程序设计天梯赛-练习集L1-002打印沙漏_pta l1-002答案

pta l1-002答案

题目要求:

输入格式:

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

输出格式:

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


输入样例:

  1. 19 *

输出样例:

  1. *****
  2. ***
  3. *
  4. ***
  5. *****
  6. 2

 解题思路:

        这道题的重点就在于找到第一行可输入的符号个数的最大值,剩下的就是打印操作。

         如何找到这个最大值x呢?观察例题中上半部分沙漏的个数(除开中间的一个*),总共有8个,关于中间的*对称,打印该沙漏至少需要8*2+1=17<19个,满足。若第一行有7个,则至少需要15*2+1=31个,越界。所以,当第一行数量为5时,能够尽可能使用完所给的 *  从而组成完整的沙漏。

        打印沙漏的过程太麻烦了,一直调试找了好多次bug终于解决了。


代码:

  1. int n, s = 0, x = 3, lev, num = 0;
  2. char l;
  3. cin >> n;//输入所给的符号数量
  4. cin >> l;//输入符号
  5. while (2 * s + 1 <= n) //循环,找到临界s、x。看不懂可以代题目中的值算一下
  6. {
  7. s = s + x;
  8. x = x + 2;
  9. num++;
  10. }
  11. s = s - x + 2;
  12. x = x - 4;//第一行输出最大的符号数
  13. lev = n - s * 2 - 1;//多余的符号数量
  14. static int j=x;
  15. for (int i = 0; i < num - 1; i++) //num-1相当于上半截沙漏的行数(不包括中间*单独的一行)
  16. {
  17. int e = i;
  18. while (e)
  19. {
  20. cout << " ";
  21. e--;
  22. }
  23. int k = j;
  24. for (k; k > 0; k -= 1)
  25. {
  26. cout << l;
  27. }
  28. cout << endl;
  29. j -= 2;
  30. }
  31. //**********************************
  32. //单独打印中间的一行
  33. for (int i = 0; i < num-1; i++)
  34. {
  35. cout << " ";
  36. }
  37. cout << l << endl;
  38. //*********************************
  39. //j因为上面最后减了2,现在变成1了,加上2,从3开始打印
  40. //下面和上面方法差不多,注意打印空格和符号方式有区别
  41. j += 2;
  42. int num1 = num - 2;
  43. for (int i = 0; i < num - 1; i++)
  44. {
  45. int k = j;
  46. int e = num1;
  47. while (e)
  48. {
  49. cout << " ";
  50. e--;
  51. }
  52. for (k; k > 0; k--)
  53. {
  54. cout << l;
  55. }
  56. cout << endl;
  57. j += 2;
  58. num1--;
  59. }
  60. cout << lev;

       小白编程,写得真的太丑了。不过我的宗旨是:我和程序有一个能跑就行。未来再优化优化吧

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/935671
推荐阅读
相关标签
  

闽ICP备14008679号