欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析
目录
- 👉🏻L1-002 打印沙漏
- 👉🏻L1-011 A-B
👉🏻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;
}