一.简单模拟
考察代码能力,不涉及算法:一类题目怎么说你就怎么做的类型~
巴音布鲁克比赛,以车队为基准评选冠军。业务要求是:第一行输入正整数N,代表车手的总个数;接下来的N行每行键入两个数字:分别是车队编号和该车手得分。最终要求输出冠军车队及其得分~
没什么可说的,直接根据数组下标来储存各个队的积分,再升序排列,将最后一位输出即可,如下:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(int argc, char** argv) { int N=0; cin>>N; vector<int> V; for(int i=1;i<=N;i++) V.push_back(0); for(int i=0;i<=N-1;i++) { int num=0,count=0; cin>>num>>count; V[num-1]+=count; } sort(V.begin(),V.end()); cout<<"全部分数如下:"<<endl; for(int i=0;i<=N-1;i++) if(V[i]!=0) cout<<V[i]<<" "; cout<<"最大值是:"<<V[N-1]<<endl; }
博主本人习惯用STL库了,其实用普通的数组和简单的最大值搜索亦可实现~
总的来说,这类纯模拟显示的题目,只需要保证:
- 数组下标不越界——或者说时间空间不超额
- STL掌握熟练
- 结构体使用灵活
一般情况下没有能卡壳的题目~
二.查找元素
小范围的查找直接遍历,范围大时可以使用二分查找(本帖暂不展开~)
键入10个学生信息,将制定班号的学生姓名全部输出:
#include <iostream> #include <vector> #include <string> using namespace std; struct student{ int num; string name; }; int main(int argc, char** argv) { vector<student> V; for(int i=0;i<10;i++) { int num=0; string name; student temp; cin>>num>>name; temp.name=name; temp.num=num; V.push_back(temp); } int num=0; cin>>num; for(int i=0;i<=V.size()-1;i++) if(V[i].num==num) cout<<V[i].name<<" "; }
同样没什么难度~
三.图形输出
大一C语言常见的阴阳类题目,需要掌握格式化输出的细节~
输入一个数字和某种字符,然后输出一个由该字符组成的、腰长为num的等腰直角三角型:
#include <iostream> using namespace std; int main(int argc, char** argv) { int num=0; char goal; cin>>num>>goal; for(int i=1;i<=num;i++) //外层控制行数 { for(int j=1;j<=i;j++) cout<<goal; cout<<endl; } }
同样很简单,没什么可说的:
四.进制转换
进制转换也是非常常用的基本功,这里博主只给出10进制分别转换为2/8/16进制的代码,至于这3种转换为10进制的函数,要考虑很多情况——比如二进制的输入方式,是int、还是vector<int>、string型,这要根据不同输入方式分类讨论~
十进制转二进制:
void TenTo2(int x) { cout<<x<<"的2进制为:"; vector<int> V; while(x!=0) { int temp=x%2; V.push_back(temp); x/=2; } for(int i=V.size()-1;i>=0;i--) cout<<V[i]; cout<<endl; }
十进制转八进制:
void TenTo8(int x) { cout<<x<<"的8进制为:"; vector<int> V; while(x!=0) { int temp=x%8; V.push_back(temp); x/=8; } for(int i=V.size()-1;i>=0;i--) cout<<V[i]; cout<<endl; }
十进制转十六进制:
void TenTo16(int x) { cout<<x<<"的16进制为:"; vector<int> V; while(x!=0) { int temp=x%16; V.push_back(temp); x/=16; } for(int i=V.size()-1;i>=0;i--) { if(V[i]<=9) cout<<V[i]; else if(V[i]==10) cout<<"A"; else if(V[i]==11) cout<<"B"; else if(V[i]==12) cout<<"C"; else if(V[i]==13) cout<<"D"; else if(V[i]==14) cout<<"E"; else if(V[i]==15) cout<<"F"; } cout<<endl; }
简单测试一下:
int main(int argc, char** argv) { int n=38; TenTo2(38); int m=100; TenTo8(m); int a=200; TenTo16(a); }
没什么问题:
(首先要会STL和手写进制转换,写出来函数很容易的~)
五.字符串处理
- 同样是非常吃代码基本功的题目类型
- 建议STL、cstring和algorithm头文件等自带的函数一定要学会
举例一道非常经典的基础题——说反话:即将输入的字符串倒序输出:
输入:My name is JSL
输出:Jsl is name My
对于新手的难点大致如下:
- 如何键入目标字符串?
- 如何逆转顺序
这里博主将输入的string断开直接保存在string型的vector中,然后图省事直接调用STL的reverse逆转一下即可~
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(){
vector<string> V;
string s;
char c;
while ((cin >> s).get(c))
{
V.push_back(s);
if (c =='\n')
break;
}
cout << "输入结束~" << endl;
reverse(V.begin(),V.end());
for(int i=0;i<=V.size()-1;i++)
cout<<V[i]<<" ";
return 0;
}
总的来说,说什么就做什么的模拟题大致上没什么难度,只要熟练使用STL几乎不会有卡壳的地方:STL中最重要的就是vector和string容器,以及algorithm中的sort、reverse、reserve,上述几者配合结构体能达到非常出类拔萃的效果~