天梯练习题集

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析

在这里插入图片描述


👉🏻L1-002 打印沙漏

mycode:

#include<iostream>
using namespace std;
int main()
{

    //中间行的符号数一定为1,上下符号数相同
    //所以假设要用x个符号来打印,上下符号数分别为x-1//2
    //符号数确定打几行:等差数列;行数越多,意味着符号用的越多
    int N;
    int remain;
    char c;
    cin>>N>>c;
    if(N<7)
    {
    	remain = N-1;
    	cout<<"*"<<endl;
    	cout<<remain<<endl;
    	return 0;
	}
    int use = N-1;//use是我们要用多少符号数,默认先将中间行的一颗符号去掉
    for(int i = use;i>=0;i--)
    {
        if(i%2==0)//说明上下符号数相同才能进来
        {
            //接下里我们单看上/下部分,是否满足等差数列和
            int partsum = i/2;
            int count = 0;
            for(int j = 3;;j+=2)
            {
                count+=j;
                if(count>partsum)
                {
                    //说明不满足,则退出
                    break;
                }
                else if(count==partsum)
                {
                    //满足,说明此时的符号数是能用掉尽可能多的符号数了
                    use = i;
                    goto end;//跳出循环
                }
            }
        }
    }
    end:
    use+=1;//把中间符号加回来
     remain = N-use;
   //接下来进行打印
    //我们可以将符号存进容器中,顺序和逆序打印
    vector<string> v;
    v.push_back(string(1,c));//第一个元素肯定是中间行的一个c
    int partsum = (use-1)/2;
    for(int i = 3;;i+=2)
    {
        string s;
        for(int j = 0;j<i;j++)
        {
            s+=c;
        }
       partsum-=i;
        v.push_back(s);
        if(!partsum)
            break;
    }
    int sz = v.size();
    //打印上半部分 
    for(int i = sz-1;i>=0;i--)
        {
        	//打印空格
			for(int j = 0;j<sz-i-1;j++)
				cout<<" "; 
        	cout<<v[i]<<endl;
		}
    //下半部分
    for(int i = 1;i<v.size();i++)
        {
        	//打印空格
			for(int j = 0;j<sz-i-1;j++)
				cout<<" "; 
        	cout<<v[i]<<endl;
		}
    cout<<remain<<endl;
    return 0;
    

}

字符用to_string变为字符串会用的是ASCII码的整型值,所以上述用了匿名函数

参考代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    char c;
    scanf("%d %c", &n, &c);
    int h = sqrt((n + 1) / 2);    //h为倒沙漏的层数
    for (int i = 0; i < h; i++)    //打印上半层沙漏
    {
        for (int j = 0; j < i; j++)
            printf(" ");
        for (int j = 0; j < 2 * (h - i) - 1; j++)
            printf("%c", c);
        printf("\n");
    }
    for (int i = 2; i <= h; i++)    //打印下半层沙漏
    {
        for (int j = 0; j < h - i; j++)
            printf(" ");
        for (int j = 0; j < 2 * i - 1; j++)
            printf("%c", c);
        printf("\n");
    }
    printf("%d", n - 2 * h * h + 1);

    return 0;
}

这里用到了公式:h = sqrt((n + 1) / 2); //h为倒沙漏的层数

所以可以得到奇数层的符号数总数公式:n = 2 * h * h-1.
偶数层的话为:n = 2 * h * h;

注:h为上半层的长度(若为奇数层,则包括中间行)

👉🏻L1-011 A-B

mycode:

#include<bits/stdc++.h>
#include<string>
using namespace std;
int main()
{
    string s1, s2;
    getline(cin, s1);
    //中间不需要getchar()
    getline(cin, s2);
    size_t pos = 0;
    while (pos != string::npos)
    {
        pos = s1.find_first_of(s2);
        if (pos!= string::npos)
            s1.erase(s1.begin()+pos);//+s1.begin()避免迭代器失效
    }
    cout << s1 << endl;
    return 0;
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值