L1-002&L1-003

发布时间 2023-10-17 19:35:37作者: Arkiya

L1-002

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

这道题目一开始看到我也没有任何思路,主要是对这种打印对应格式的内容只停留在printf了,
分析一下这道题目:
输入符号和个数,根据个数输出对应的沙漏,如果有多的就输出多几个
那么需要一个符号变量,一个总量,还需要几个变量用于计数
然后观察,发现这个沙漏是上下对称的,每个半边都是一个等差数列,前n项和为n方
所以半边半边的看的话,假设每个半边都是m行
也就是说 相当于半边的等差数列有m项,也就是说 n = m方*2-1
所以算出m等于sqrt((n+1)/2)
之后就是输出的问题了,采用上下半分开输出的方式,当然,就上半来说,每行需要输出的
空格数分别是0,1,2,3.....也就是用一个变量,每行输出的时候让它自己加一
这样就能做到每行比上一行多输出一个空格的目的了
然后是具体输出的过程,上半相当于从第m项输出到第一项,也即是
for(int i = m;i>=1;i--)
z这每一次的循环都是在输出每一行的内容
中间嵌套刚才说的输出空格 也就是
for(int j = 0;j<m-i;j++)
m-1一开始是0,然后是1,然后是2....根据这个变化输出不同个数的空格
然后就可以进行符号的输出了
for(int k = 0;k<2*i-1;k++)
2*i-1,相当于等差数列第i行输出2*i-1个符号
这样上半就做完了
下半循环由于上半已经输出了一个符号的情况,因此i从2开始
for(int i = 2;i<=m;i++)
然后再嵌套空格和符号输出即可,
对于数字的计算,定义一个count1,count2,每次k循环输出一个符号的时候++
这样最终用n减去他们俩的和就是剩下的数字了
代码如下
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n = 0, m = 0;
    char c;
    int i = 0, j = 0, k = 0;
    int count1 = 0, count2 = 0, count = 0;
    cin >> n >> c;
    m = sqrt((n + 1) / 2);
    for (i = m; i >= 1; i--)
    {
        for (j = 0; j < m - i; j++)
            cout << " ";
        for (k = 0; k < 2 * i - 1; k++)
        {
            cout << c;
            count1++;
        }
        cout << endl;
    }
    for (i = 2; i <= m; i++)
    {
        for (j = 0; j < m - i; j++)
            cout << " ";
        for (k = 0; k < 2 * i - 1; k++)
        {
            cout << c;
            count2++;
        }
        cout << endl;
    }
    count = count1 + count2;
    cout << n - count << endl;
}

对于这道题目,重点在于把每一行看作等差数列的每一项去处理,就能够做出来了

L1-003

这道题目主要问题在于,一开始我定义了一个char[1000],然后循环输入检测,问题在于每次都需要输入1000位

而不能自己停止,在这种情况下,选择换成了string,检测是否为‘\0’,是说明到末尾了

代码

#include <iostream>
using namespace std;
int main()
{
    string s;
    int a0=0, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0, a9=0;
    cin >> s;
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] != '/0')
        {
            switch (s[i]){
            case '0':
                a0++;
                break;
            case '1':
                a1++;
                break;
            case '2':
                a2++;
                break;
            case '3':
                a3++;
                break;
            case '4':
                a4++;
                break;
            case '5':
                a5++;
                break;
            case '6':
                a6++;
                break;
            case '7':
                a7++;
                break;
            case '8':
                a8++;
                break;
            case '9':
                a9++;
                break;

            }
        }
    }
    int a[10] = { a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 };
    for (int j = 0; j < 10; j++)
    {
        if (a[j] != 0)
        {
            cout << j << ":" << a[j] << endl;
        }
    }
    return 0;


}