小学期之际,时间比较充足,除了对算法和c++学习之外,尝试用c++开始重做PAT乙级题目
目前完成了30道,总结下前30道中遇到的小技巧,和一些知识,希望能给自己加深印象,如果能便利其他人就更好了
第一套:
1001:无
1002:要求读出这个数的每个数字,当然要用string数组分别存储yi,er,san,si,wu等
1003:能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T中间不能没有A,用map容器,对字符的个数进行统计
1004:无
1005:对验证过的数用数组存起来
第二套:
1001:用数组存起来三个字母的个数
1002:无
1003:M要对N取余,因为M的大小没有规定,可能会出现周期的问题(转一圈又回来了)
1004:stack容器,把元素压入栈顶,如果栈不为空,就弹出栈顶元素,轻松实现倒叙
1005:无
第三套:
1001:范围恰好可以用long long int,不需要转换成字符串处理
int 范围: -2147483648~2147483647 (10位数)
long long int范围:-9223372036854775808~9223372036854775807 (19位数)
1002:无
1003:统计素数的个数,
while(num<N); if (a% 10 != 1) cout<<' ';if(a%10==0) cout<<endl;
1004:无
1005:重点是cmp的写法,这里借用一下柳神的写法
int cmp(struct node a, struct node b) {
if ((a.de + a.cai) != (b.de + b.cai))
return (a.de + a.cai) > (b.de + b.cai);
else if (a.de != b.de)
return a.de > b.de;
else
return a.num < b.num;
}
第四套
1001:无
1002:大数的模拟除法,核心代码
for (int i = 1; i < len; i++) {
t = (temp * 10 + s[i] - '0') / a;
cout << t;
temp = (temp * 10 + s[i] - '0') % a;
}
1003:无
1004:无
1005:用一个结构体分别存单价,总价,总量,优先把单价最高的全部售出,emm这个好像还是开学初学长给的题
第五套
1001:无
1002:核心代码
while (t != 0) {
s[i++] = t % d;
t = t / d;
}
1003:排序从小到大,先放大于0的最小的那个然后顺序放,注意他给的是个数不是数字
1004:用string,和getline(cin,a);直接获取字符串,然后找E以前的和E以后的进行操作
1005:next数组的操作
第六套
1001:无
1002:打印图形,数学题,2 * M - 1
1003: 直接用字符串保存年龄最小的和年龄最大的,分别为1814/09/06和2014/09/06,直接和输入的字符串比较大小,并保存最大最小的字符串
1004:用字符串的find(),string::npos是没有相同的,find找的是下标,toupper()小写变大写;
1005:外层循环从0开始,内层循环从i+result开始,核心代码
for (int i = 0; i < n; i++) {
for (int j = i + result; j < n; j++) {
if (v[j] <= v[i] * p) {
temp = j - i + 1;
if (temp > result)
result = temp;
}
else {
break;
}
}
}
最后感谢柳神,学长,老师,和同学们