《算法笔记》总结No.2——模拟

一.简单模拟

考察代码能力,不涉及算法:一类题目怎么说你就怎么做的类型~

巴音布鲁克比赛,以车队为基准评选冠军。业务要求是:第一行输入正整数N,代表车手的总个数;接下来的N行每行键入两个数字:分别是车队编号和该车手得分。最终要求输出冠军车队及其得分~


没什么可说的,直接根据数组下标来储存各个队的积分,再升序排列,将最后一位输出即可,如下:

cpp 复制代码
#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个学生信息,将制定班号的学生姓名全部输出:

cpp 复制代码
#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的等腰直角三角型:

cpp 复制代码
#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型,这要根据不同输入方式分类讨论~

十进制转二进制:

cpp 复制代码
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;
}

十进制转八进制:

cpp 复制代码
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;
}

十进制转十六进制:

cpp 复制代码
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;
} 

简单测试一下:

cpp 复制代码
int main(int argc, char** argv) 
{
	int n=38;
	TenTo2(38);
	int m=100;
	TenTo8(m);
	int a=200;
	TenTo16(a);
}

没什么问题:

首先要会STL和手写进制转换,写出来函数很容易的~

五.字符串处理

  • 同样是非常吃代码基本功的题目类型
  • 建议STLcstringalgorithm头文件等自带的函数一定要学会

举例一道非常经典的基础题------说反话:即将输入的字符串倒序输出:

输入:My name is JSL

输出:Jsl is name My

对于新手的难点大致如下:

  1. 如何键入目标字符串?
  2. 如何逆转顺序

这里博主将输入的string断开直接保存在string型的vector中,然后图省事直接调用STL的reverse逆转一下即可~

cpp 复制代码
#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,上述几者配合结构体能达到非常出类拔萃的效果~

相关推荐
_F_y2 小时前
MySQL用C/C++连接
c语言·c++·mysql
兩尛2 小时前
c++知识点2
开发语言·c++
xiaoye-duck3 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
BackCatK Chen3 小时前
C语言学习栏目目录
c语言·保姆级教程·c语言入门·c语言学习栏目目录
Azure_withyou3 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月3 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
极客数模4 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
L_09075 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
A_nanda5 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
代码雕刻家7 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯