本文主要是介绍《算法笔记》总结No.2——模拟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.简单模拟
考察代码能力,不涉及算法:一类题目怎么说你就怎么做的类型~
巴音布鲁克比赛,以车队为基准评选冠军。业务要求是:第一行输入正整数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,上述几者配合结构体能达到非常出类拔萃的效果~
这篇关于《算法笔记》总结No.2——模拟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!