PAT (Basic Level) Practice 刷题笔记(1)
第一题笔记:首先,第一个难点在于如何输入:“1234567890987654321123456789“这么大的数字,C++中最大的long long 数据类型所能表示范围:-2^63 ~2^63-1,仍然无法保存,这种情况就要将数字以字符数组的形式输入更合适。以字符数组输入长数字之后,就要将每一个字符数字转换为整形数字,这里用的方法是:arr[i] - '0'。将数字字符减 ‘0’ 即可得到整型数
第一题
笔记:
- 首先,第一个难点在于如何输入:“1234567890987654321123456789“这么大的数字,C++中最大的long long 数据类型所能表示范围:-2^63 ~ 2^63-1,仍然无法保存,这种情况就要将数字以字符数组的形式输入更合适。
- 以字符数组输入长数字之后,就要将每一个字符数字转换为整形数字,这里用的方法是:
arr[i] - '0'
。将数字字符减 ‘0’ 即可得到整型数字。 - 算出数字和之后,要根据每一位数字来输出不同的字符串,这时有两种方法,第一种是通过取模将每一位的数字算出来并保存,第二种是将数字转换为字符数组;我认为第二种更为简便,只需使用sprintf函数即可实现。
- sprintf函数使用格式:(目标字符串,“格式”,数字)
sprintf(s, "%d", 123); //把整数123 打印成一个字符串保存在s 中
- 最后通过swtich分情况输出即可。
我的代码:
#include <iostream>
using namespace std;
int main( ){
char arr[100];
int s = 0;
char res[100];
cin>>arr;
for (int i = 0; i < strlen(arr); ++i) {
s += arr[i] - '0';
}
sprintf(res,"%d",s);
for (int i = 0; i < strlen(res); ++i) {
switch (res[i]) {
case '0':
cout<<"ling";
break;
case '1':
cout<<"yi";
break;
case '2':
cout<<"er";
break;
case '3':
cout<<"san";
break;
case '4':
cout<<"si";
break;
case '5':
cout<<"wu";
break;
case '6':
cout<<"liu";
break;
case '7':
cout<<"qi";
break;
case '8':
cout<<"ba";
break;
case '9':
cout<<"jiu";
break;
}
if (i != strlen(res) - 1){
cout<<" ";
}
else cout<<endl;
}
}
//1234567890987654321123456789
第二题:
这道题的题意实在难以理解,想了好久还是不太明白
我的代码(部分正确):
#include <iostream>
#include <cstring>
using namespace std;
int main( ){
int n,flag;
char arr[100];
int res[100];
cin>>n;
for (int i = 0; i < n; ++i) {
flag = 1;
cin>>arr;
for (int j = 0; j < strlen(arr); ++j) {
if (j == strlen(arr) - 1){
flag = 1;
break;
}
if (arr[j] == 'A'){
if (arr[j+1] == 'A' || arr[j+1] == 'P' || arr[j+1] == ' ' || arr[j+1] == 'T'){continue;}
else{
res[i] = 0;
flag = 0;
break;
}
}
else if (arr[j] == 'P'){
if (arr[j+1] == 'A' || arr[j+1] == ' '){continue;}
else{
res[i] = 0;
flag = 0;
break;
}
}
else if (arr[j] == 'T'){
if (arr[j+1] == 'A' || arr[j+1] == ' '){continue;}
else{
res[i] = 0;
flag = 0;
break;
}
}
else{
res[i] = 0;
flag = 0;
break;
}
}
if (flag == 1){
res[i] = 1;
}
}
for (int i = 0; i < n; ++i) {
if (res[i] == 1){
if (i != n-1) {
cout << "YES" << endl;
}
else cout << "YES";
}
else {
if (i != n - 1) {
cout << "NO" << endl;
}
else cout << "NO";
}
}
}
分析:(转载自这里)
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
那么正确的有这些:
PAT
APATA
AAPATAA
AAAPATAAA
…不说了,就是中间一个A左右加上等量的A(不加也行)都是正确的。
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
拿上面的那几个正确的举例子,那么正确的有这些:
PAT —— 对于 aPbTc 来说ac是空,b是A。所以 PAAT 是正确的。同理PAAAAAT中间加多少个A都是正确哒~
APATA —— 对于aPbTc来说,abc都是A。所以 APAATAA 是正确的。再类推一下,那么 APAAATAAA 是正确的。
AAPATAA —— 对于aPbTc来说,a和c是AA,b是A。所以AAPAATAAAA是正确的,再类推一下,AAPAAATAAAAAA 是正确的~~
所以说规律就是,可以在P和T中间加A并且在T后面加A,要求必须是,中间加上一个A,末尾就得加上几倍的(P前面A的那个字符串)。换句话说就是,中间的A的个数如果是3,那么末尾的A的个数就得是开头A的个数的3倍。很巧,当中间A为一个的时候,末尾和开头A的个数必须相等正好是第二条的要求~
所以一句话总结字符串的要求:只能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T中间不能没有A~
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, p = 0, t = 0;
string s;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> s;
map<char, int> m;
for(int j = 0; j < s.size(); j++) {
m[s[j]]++;
if (s[j] == 'P') p = j;
if (s[j] == 'T') t = j;
}
if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1 && p * (t-p-1) == s.length()-t-1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
第三题
我的代码:
#include <iostream>
#include <cstring>
using namespace std;
struct Student{
string name;
string num;
int score;
};
int main( ){
int n;
int flag_max = 0;
int flag_min = 0;
int max = 0;
int min = 0;
Student stu[100];
cin>>n;
for (int i = 0; i < n; ++i) {
cin>>stu[i].name>>stu[i].num>>stu[i].score;
if (stu[i].score >= max){
max = stu[i].score;
flag_max = i;
}
if (stu[i].score <= min){
min = stu[i].score;
flag_min = i;
}
}
cout<<stu[flag_max].name<<" "<<stu[flag_max].num<<endl;
cout<<stu[flag_min].name<<" "<<stu[flag_min].num<<endl;
}
分析:
- 我定义了一个Student的结构体,这样可以让输入的数据分的更清楚,易于比较。
- 在网上看到了别人的代码,方法比较奇特:
#include<stdio.h>
using namespace std;
#include<algorithm>
typedef struct Student{ char name[11]; //注意不是char name[10]; char num[11]; int score;
}student;
bool cmp(Student a,Student b) //运用c++中带有的sort()排序函数;进行降序排列
{ return a.score>b.score;
}
int main()
{ int n; scanf("%d",&n); Student stu[n]; for(int i=0;i<n;i++) { scanf("%s%s%d",(stu[i].name),(stu[i].num),&(stu[i].score)); getchar(); } sort(stu,stu+n,cmp); printf("%s %s\n",stu[0].name,stu[0].num); printf("%s %s\n",stu[n-1].name,stu[n-1].num); return 0;
}
更多推荐
所有评论(0)