目录
简单模拟 20题 7 字符串处理 17题 1 进制转换 3题 数学 4题 动态规划 2题
中级模拟 7题 散列 11题 贪心 3题 排序 4题 链表 2题
水题 3题 √3 素数 3题 查找 7题 1 stl 3题 其他 6题
11
X:没想明白
?:在想想
编号 | 标题 | 分类 |
简单模拟 | ||
1001 √ | 3n+1猜想 | 简单模拟 |
1008 | 数组元素循环右移问题 | 简单模拟 X |
1010 | 一元多项式求导 | 简单模拟 |
1011 | A+B 和 C | 简单模拟 |
1012 | 数字分类 | 简单模拟 X |
1016 | 部分A+B | 简单模拟 |
1018 | 锤子剪刀布 | 简单模拟 ? |
1026 | 程序运行时间 | 简单模拟 |
1046 | 划拳 | 简单模拟 |
1053 | 住房空置率 | 简单模拟 |
1056 | 组合数的和 | 简单模拟 |
1061 | 判断题 | 简单模拟 |
1063 | 计算谱半径 | 简单模拟 |
1066 | 图像过滤 | 简单模拟 |
1068 | 万绿丛中一点红 | 简单模拟 |
1071 | 小赌怡情 | 简单模拟 |
1076 | Wifi密码 | 简单模拟 |
1077 | 互评成绩计算 | 简单模拟 |
1088 | 三人行 | 简单模拟 |
1089 | 狼人杀-简单版 | 简单模拟 |
中级模拟 | ||
1050 | 螺旋矩阵 | 中级模拟 |
1055 | 集体照 | 排序+中级模拟 |
1058 | 选择题 | 中级模拟+常用stl |
1060 | 爱丁顿数 | 中级模拟 |
1069 | 微博转发抽奖 | 中级模拟 |
1072 | 开学寄语 | 中级模拟+二分查找 |
1073 | 多选题常见计分法 | 中级模拟+常用stl |
水题 | ||
1086 | 就不告诉你 | 水题(字符串string)(小技巧) |
1087 | 有多少不同的值 | 水题(set s.size s.insert) |
1091 | N-自守数 | 水题 X |
字符串处理 | ||
1002 √ | 写出这个数 | 字符串处理 |
1006 | 换个格式输出整数 | 字符串处理 |
1009 | 说反话 | 字符串处理 |
1014 | 福尔摩斯的约会 | 字符串处理 |
1021 | 个位数统计 | 字符串处理 |
1024 | 科学计数法 | 字符串处理 |
1027 | 打印沙漏 | 字符串处理 |
1031 | 查验身份证 | 字符串处理 |
1044 | 火星数字 | 进制转换+字符串处理 |
1048 | 数字加密 | 字符串处理 |
1052 | 卖个萌 | 字符串处理 |
1054 | 求平均值 | 字符串处理 |
1067 | 试密码 | 字符串处理 |
1074 | 宇宙无敌加法器 | 进制转换+字符串处理 |
1078 | 字符串压缩与解压 | 字符串处理 |
1081 | 检查密码 | 字符串处理 |
1084 | 外观数列 | 字符串处理 |
进制转换 | ||
1022 | D进制的A+B | 进制转换 |
1037 | 在霍格沃茨找零钱 | 进制转换 |
1057 | 数零壹 | 进制转换 |
散列 | ||
1005 | 继续(3n+1)猜想 | 散列 |
1029 | 旧键盘 | 散列 |
1033 | 旧键盘打字 | 散列 |
1038 | 统计同成绩学生 | 散列 |
1039 | 到底买不买 | 散列 |
1042 | 字符统计 | 散列 |
1043 | 输出PATest | 散列 |
1047 | 编程团体赛 | 散列 |
1059 | C语言竞赛 | 散列 |
1065 | 单身狗 | 散列+常用stl |
1093 | 字符串A+B | 散列 |
数学 | ||
1003 | 我要通过! | 数学 |
1019 | 数字黑洞 | 数学 |
1049 | 数列的片段和 | 数学 |
1051 | 复数乘法 | 数学 |
贪心 | ||
1020 | 月饼 | 贪心 |
1023 | 组个最小数 | 贪心 |
1070 | 结绳 | 贪心 |
排序 | ||
1015 | 德才论 | 排序 |
1080 | MOOC期终成绩 | 排序 |
1085 | PAT单位排行 | 排序 |
1095 | 解码PAT准考证 | 排序 |
素数 | ||
1007 | 素数对猜想 | 素数 |
1013 | 数素数 | 素数 |
1094 | 谷歌的招聘 | 素数 |
查找 | ||
1004 | 成绩排名 | 查找元素 |
1028 | 人口普查 | 查找元素 |
1030 | 完美数列 | 二分查找、two pointers |
1032 | 挖掘机技术哪家强 | 查找元素 |
1041 | 考试座位号 | 查找元素 |
1082 | 射击比赛 | 查找元素 |
1092 | 最好吃的月饼 | 查找元素 |
常用stl | ||
1064 | 朋友数 | 常用stl |
1083 | 是否存在相等的差 | 常用stl |
1090 | 危险品装箱 | 常用stl |
动态规划 | ||
1040 | 有几个PAT | 动态规划 |
1045 | 快速排序 | 动态规划 |
链表 | ||
1025 | 反转链表 | 链表 |
1075 | 链表元素分类 | 链表 |
其他 | ||
1017 | A除以B | 大整数运算 |
1079 | 延迟的回文数 | 大整数运算 |
1035 | 插入与归并 | 暂无 |
1036 | 跟奥巴马一起编程 | 图形输出 |
1034 | 有理数四则运算 | 分数 |
1062 | 最简分数 | 分数 |
1001.3n+1猜想
C语言版
#include<stdio.h>
int main()
{
int n,i;
i=0;
scanf("%d",&n);
while(n!=1)
{
i++;
if(!(n%2))//(n%2)->=1 !(n%2)->n%2==0
{
n=n/2;
}
else
{
n=(3*n+1)/2;
}
}
printf("%d",i);
}
C++
#include <iostream>
using namespace std;
int main() {
int n, count = 0;
cin >> n;
while (n != 1) {
if (n % 2 != 0) n = 3 * n + 1;
n = n / 2;
count++;
}
cout << count;
return 0;
}
1002.写出这个数
我以C为主,C++参考,同时学习有些函数和概念。
代码多数是参考别人的。得多读点写法。
写一下这题过程中的问题,在写这个程序的时候,我一直在想如何输入一个数,让这个数中的每个数相加,我想写一个for循环,但是不知道如何去取这个数的边界值,所以到后面就想不出来了。
过程中就算是看了别人的代码,也出现了很多低级错误,还是得谨慎。
考查:字符串的转换,单个字符的输入,如何取一个数的百十个,字符串大小问题
问题:用C++来写是完全不会,很多东西也不懂为啥是这样,不过还好有万能的百度。即查即用。
#include<bits/stdc++.h>包含C++的所有头文件
temp[s[i]-'0'].c_str() 解释
https://blog.csdn.net/zhanghuaichao/article/details/53158332
解释:string num = to_string(sum);
功能:
将数值转化为字符串。返回对应的字符串。
C
#include<stdio.h>
int main() //c=getchar() 没加括号 a[80]不够了 != sum/10%10
{
int sum=0;
char c,*a[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
while((c=getchar())!='\n')
sum += c - '0';//c为字符串 比如输入1-49 0-48
if(sum/100)
printf("%s ",a[sum/100]);
if(sum/10)
printf("%s ",a[sum/10%10]);
printf("%s",a[sum%10]);
}
C++
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;//C++特有字符串
cin >> s;
int sum = 0;
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi","ba", "jiu"};
for (int i = 0; i < s.length(); i++)//字符串长度
sum += (s[i] - '0');
string num = to_string(sum);//把sum-135 给 num;C++直接定义
for (int i = 0; i < num.length(); i++) {
if (i != 0) cout << " ";//看题意不可能有0,小技巧
cout << str[num[i] - '0'];//数组中的数组,这样似乎更方便?
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int sum=0;
for(int i=0;i<s.size();++i)
sum+=s[i]-'0';
s=to_string(sum);
string temp[10]={
"ling","yi","er","san","si","wu","liu","qi","ba","jiu"
};
for(int i=0;i<s.size();++i)
printf("%s%s",i>0?" ":"",temp[s[i]-'0'].c_str());
return 0;
}
1004.成绩排名
问题:为什么别人的想法总是很简单?自己好好多想想,还是得多做题,多读代码,多写多思考。注意笔记。
思考:我先是想到了结构体,但是忘记怎么写了。
while (~scanf("%d%d",&m,&n))什么用的?!=EOF
C
#include <stdio.h>
#include <string.h>
int main()
{
int N;
scanf("%d", &N);//输入数量
char maxname[11], minname[11], curname[11],//姓名,学号;
maxid[11], minid[11], curid[11];
int maxgrade = -1, mingrade = 101, curgrade;//分数
for(int i = 0; i < N; i++)
{
scanf("%s %s %d", curname, curid, &curgrade);
if(curgrade > maxgrade)
{
strcpy(maxname, curname);//复制 后给前
strcpy(maxid, curid);
maxgrade = curgrade;
}
if(curgrade < mingrade)
{
strcpy(minname, curname);
strcpy(minid, curid);
mingrade = curgrade;
}
}
printf("%s %s\n%s %s", maxname, maxid, minname, minid);
}
#include<stdio.h>
#include<string.h>
int main()
{
int n=0;
scanf("%d",&n);
struct info{
char name[15];
char num[15];
int grade;
};
struct info stu,max,min;
scanf("%s %s %d",&stu.name,&stu.num,&stu.grade);
max=min=stu;
for(int i=1;i<n;i++)
{
scanf("%s %s %d",&stu.name,&stu.num,&stu.grade);
if (stu.grade>max.grade) max=stu;
if (stu.grade<min.grade) min=stu;
}
printf("%s %s\n",max.name,max.num);
printf("%s %s\n",min.name,min.num);
}
C++
#include <iostream>
using namespace std;
int main()
{
int n, max = -1, min = 101, score;
cin >> n;
string maxname, minname, maxnum, minnum, name, num;
for (int i = 0; i < n; i++) {
cin >> name >> num >> score;
if (max < score) {
max = score;
maxname = name;
maxnum = num;
}
if (min > score) {
min = score;
minname = name;
minnum = num;
}
}
cout << maxname << " " << maxnum << endl << minname << " " << minnum;
1086 就不告诉你
好吧,我是越写到后面就越觉得自己是个废物。不会的东西明明那么多,明明知道如何变强,却什么也不学,天天浪费时间。
明明是水题,却可能写也写不出来。
https://blog.csdn.net/yky__xukai/article/details/79554963
stoi()把数字字符串转换成int输出stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!
将数值转化为字符串。返回对应的字符串。 to_string
reverse(s.begin(), s.end()) c++ 字符串倒置函数
#include<bits/stdc++.h>
using namespace std;
int main(){
int A,B;
scanf("%d%d",&A,&B);
A*=B; // A=A*B 5*7=35=A
for(B=0;A!=0;A/=10) // 1. B=0+5 B=5 A/10=3 2.B=5*10+3=53
B=B*10+A%10;
printf("%d",B);
return 0;
}
#include <stdio.h>
int main()
{
int A, B, C;
scanf("%d %d", &A, &B);
C = A * B;
while(!(C % 10)) // c%10==0 5*7=35 20
C /= 10; // 如果C=20 C/=10=2 下一步就是输出C=2
while(C) //53
{
putchar('0' + C % 10);//输出单个
C /= 10;
}
return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int a, b;
scanf("%d %d", &a, &b);
string s = to_string(a * b);
reverse(s.begin(), s.end());
printf("%d", stoi(s));
return 0;
}
1087 有多少不同的值 (20分)
https://www.cnblogs.com/AKMer/p/9889811.html
明明是个水题,为什么看了答案,就能想明白,自己想的什么,却什么思路都没有。我是想到了FOR循环。
还是有一点吧,就是说 对语言的熟悉程序还是不够,其次没读懂题,看见题目的时候,就有点害怕。
C++的 STL学习的重要性 运用的重要性 算法思想
#include <set>
set
set头文件主要包括set和multiset两个容器。他们都是有序集合,不过set存的元素不可重复。
两者内部实现都是红黑树,在使用方法上差别不大,支持的函数基本相同。
#include <stdio.h>
int main()
{
int c,m,m0=-1,count=0,n;
scanf("%d",&m);
for(n=1;n<=m;n++)
{
c=(n/2)+(n/3)+(n/5);
if(c>m0)
count++;
m0=c;
}
printf("%d",count);
}
#include <iostream>
#include <set>
using namespace std;
int main() {
int n;
scanf("%d", &n);
set<int> s;//声明方式
for (int i = 1; i <= n; i++)
s.insert(i / 2 + i / 3 + i / 5);//插入一个int类型的数据
printf("%d", s.size());//返回元素个数
return 0;
}
1091 N-自守数 还没写好 还没想过
1008 数组元素循环右移问题 (20分) 没想明白
1111
11
1
#include <stdio.h>
int main()
{
int N, M, numbers[100];
scanf("%d %d", &N, &M);
M %= N; /* M could be larger than N */
/* Read */
for(int i = 0; i < N; i++)
scanf("%d", &numbers[i]);
/* Print */
for(int i = N - M; i < N; i++) /* Print N - M to N - 1 */
printf("%d ", numbers[i]);
for(int i = 0; i < N - M - 1; i++) /* Print 0 to N - M - 2 */
printf("%d ", numbers[i]);
printf("%d", numbers[N - M - 1]); /* Print N - M - 1, no blankspace */
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
m %= n;
if (m != 0) {
reverse(begin(a), begin(a) + n);
reverse(begin(a), begin(a) + m);
reverse(begin(a) + m, begin(a) + n);
}
for (int i = 0; i < n - 1; i++)
cout << a[i] << " ";
cout << a[n - 1];
return 0;
}
1010 一元多项式求导 (25分)
题目 居然有隐藏条件 不得不说 读题的时候 还是得仔细
“输出导数多项式非零项的系数和指数”这个条件就是输出的时候只要某一项的指数为0,那么就不输出
这题的话 我想到了一点点,但是没有自己去写,然后看了别人的话,没发现隐藏条件的话,估计怎么写,也不会对。
#include <stdio.h>
int main()
{
int coef, index, count = 0;
while(scanf("%d %d", &coef, &index) != EOF)
{
if(index) /* Constant terms result in zero */
{
if(count++) putchar(' ');
printf("%d %d", coef * index, index - 1);
}
}
/* Zero polynomial or constant */
if(count == 0)
puts("0 0");
}
#include<iostream>
using namespace std;
int main()
{
int coef;
int expo;
cin>>coef>>expo;
if(expo==0)//如果指数为0,则求导后是0多项式
{
cout<<"0 0";
return 0;
}
else//注意第一次输出的格式 !
cout<<coef*expo<<' '<<expo-1;
while(cin>>coef>>expo)//输入直到文件末尾
if(expo!=0)//注意如果指数为0,不作输出!
cout<<' '<<coef*expo<<' '<<expo-1;//注意要先输出空格!
return 0;
}
1011 A+B 和 C (15分)
我写程序的样子 像个智障 连基本的逻辑 都没有 问题 还很多 还找不出来 以前为什么会有喜欢编程的想法
然后真正去操作的时候,越来越觉得或许自己不适合做程序员。
换行符的问题 for在里面与外面的问题 还有最后如何是控制 i 往简单想 大道至简 还有就是数据类型 %ld
#include<stdio.h>
int main()
{
int T,i=0;
long int A,B,C;
scanf("%d",&T);
while(scanf("%ld %ld %ld",&A,&B,&C)!=EOF)
{
i++;
if(A+B>C)
{
printf("Case #%d: true\n",i);
}
else
printf("Case #%d: false\n",i);
}
}
#include <iostream>
using namespace std;
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
long long int a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
printf("Case #%d: %s\n", i + 1, a + b > c ? "true" : "false");
}
return 0;
}
1012 数字分类 (20分)
1016 部分A+B (15分)
有时候觉得有些编程题真傻逼,明明可以看出答案,却为什么还要我们写出来。
可基础决定高度。傻逼的往往是你自己,那个不求进取的自己。
这题我有大概的思路,不过还是错了。
#include <stdio.h>
long Dpart(long A, int D_A)
{
long P_A;
for(P_A = 0; A; A /= 10)
if(A % 10 == D_A)
P_A = P_A * 10 + D_A;
return P_A;
}
int main()
{
long A, B;
int D_A, D_B;
scanf("%ld %d %ld %d", &A, &D_A, &B, &D_B);
printf("%ld", Dpart(A, D_A) + Dpart(B, D_B));
return 0;
}
#include <cstdio>
int main()
{
char a[12],b[12],da,db;
while(~scanf("%s %c %s %c",a,&da,b,&db))
{
int acount=0,bcount=0;
for(int i=0;a[i]!='\0';++i)
{
if(a[i]==da)
++acount;
}
for(int i=0;b[i]!='\0';++i)
{
if(b[i]==db)
++bcount;
}
int sa=0,sb=0;
for(int i=0;i<acount;++i)
sa=10*sa+da-48;//'0'
for(int i=0;i<bcount;++i)
sb=10*sb+db-48;
printf("%d",sa+sb);
}
return 0;
}
1018 锤子剪刀布 (20分)
水题,然后因为我在做康复训练,一直不在状态。。。所以就算我在状态,估计我也不会。有些东西还是得花时间。
#include <stdio.h>
char max(int B, int C, int J)
{
if(B >= C && B >= J) return 'B';
if(C > B && C >= J) return 'C';
/* J > B && J > C */ return 'J';
}
int main()
{
int N;
char a, b;
int AwinB = 0, AwinC = 0, AwinJ = 0;
int BwinB = 0, BwinC = 0, BwinJ = 0;
scanf("%d", &N);
for(int i = 0; i < N; i++)
{
scanf(" %c %c", &a, &b); /* Notice the space before every %c */
if(a == 'B' && b == 'C') AwinB++;
if(a == 'C' && b == 'J') AwinC++;
if(a == 'J' && b == 'B') AwinJ++;
if(a == 'B' && b == 'J') BwinJ++;
if(a == 'C' && b == 'B') BwinB++;
if(a == 'J' && b == 'C') BwinC++;
}
int Awin = AwinB + AwinC + AwinJ;
int Bwin = BwinB + BwinC + BwinJ;
int Tie = N - Awin - Bwin;
printf("%d %d %d\n", Awin, Tie, Bwin);
printf("%d %d %d\n", Bwin, Tie, Awin);
printf("%c %c", max(AwinB, AwinC, AwinJ), max(BwinB, BwinC, BwinJ));
return 0;
}