1027 打印沙漏 (20分)
感觉比较复杂的部分就是输出的条件判断,其他还好。分成上下两部分即可
#include<iostream>
using namespace std;
int main()
{
char c;
int sum = 0;
int ceng = 0, yu = 0,temp=1;
cin >> sum >> c;
if (sum == 1)
{
cout << c << endl << 0;
return 0;
}
for (int i = 3; i < 500; i+=2)//获得层数和余数
{
temp += i * 2;
if (temp >= sum)
{
ceng = i-2;//获得层数
//cout << ceng << endl;
yu = sum - (temp - i * 2);//取余
break;
}
}
//输出沙漏上半部分,包括中间
for (int i = 0; i < (ceng / 2)+1; i++)
{
for (int i1 = ceng-i; i1 < ceng;i1++)//输出空格
{
cout << " ";
}
for (int i1 = ceng-i*2; i1 >0; i1--)//输出符号
{
cout << c;
}
cout << endl;
}
//输出沙漏下半部分
for (int i = 0; i < ceng / 2; i++)
{
//for (int i1 = i; i1 < ceng / 2; i++)
for (int i1 = ceng/2 - i - 1; i1 > 0; i1--)
{
cout << " ";
}
for (int i1 = 0; i1 < 3+2*i; i1++)
{
cout << c;
}
cout << endl;
}
cout << yu;
return 0;
}
1028 人口普查 (20分)
最后输出需要分是否为0的情况,否则测试点3无法通过。其实这样的是偷懒的做法,因为没办法判断输入的日期是否是正确的,不过这个方法最快。如果要转换成数字
#include<iostream>
using namespace std;
int main()
{
int n = 0, sum = 0;
cin >> n;
string name, bir, maxb = "1814/09/06", maxn, minb = "2014/09/06", minn;
for (int i = 0; i < n; i++)
{
cin >> name >> bir;
if (bir >= "1814/09/06" && bir <= "2014/09/06")
{
sum++;//
if (bir > maxb)
{
maxb = bir;
maxn = name;
}
if (bir<minb)
{
minb = bir;
minn = name;
}
}
}
if(sum!=0)
cout << sum << " " << minn << " " << maxn;
else
cout << sum;
return 0;
}
1029 旧键盘 (20分)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
char tob(char c)//转换成大写
{
if (c >= 'a' && c <= 'z')
{
c = c - 'a' + 'A';
}
return c;
}
int main()
{
string a, b;
cin >> a >> b;
vector<char> v;
int ap=0, bp=0;
while(ap != a.size() || bp != b.size())//当两个标记都没有到末尾
{
if (a[ap] == b[bp])
{
ap++; bp++;
}
else
{
int temp = 0;
for (int i = 0; i < v.size(); i++)//判断是否之前已经存放过缺失字母
{
if (v[i] == tob(a[ap]))
temp = 1;
}
if (temp == 0)//未存放过,存放,并且标记字段++
{
v.push_back(tob(a[ap])); ap++;
}
else//否则直接标记字段++
ap++;
}
}
for (int i = 0; i < v.size(); i++)
{
cout << v[i];
}
return 0;
}