当前位置: 代码迷 >> 综合 >> PAT乙级 1027 打印沙漏 (20分) 1028 人口普查 (20分) 1029 旧键盘 (20分)
  详细解决方案

PAT乙级 1027 打印沙漏 (20分) 1028 人口普查 (20分) 1029 旧键盘 (20分)

热度:26   发布时间:2023-12-17 14:15:34.0

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;elsecout << 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;
}