考研机试题 -- 排序进位制日期

Posted cutlery1137

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了考研机试题 -- 排序进位制日期相关的知识,希望对你有一定的参考价值。

目录

成绩排序(稳定排序)

https://www.noobdream.com/DreamJudge/Issue/page/1151/

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int N = 1010;

struct Stu 
	string name;
	int score;

	bool operator < (const Stu &w) const 
		return score < w.score;
	
	bool operator > (const Stu &w) const 
		return score > w.score;
	
 stu[N];

int main() 
	int n, m;
	cin >> n >> m;
		
	for(int i = 0; i < n; i ++) 
		cin >> stu[i].name >> stu[i].score;
	
	if(m == 1)
		stable_sort(stu, stu + n);
	else
		stable_sort(stu, stu + n, greater<Stu>());
		
	for(int i = 0; i < n; i ++)
		cout << stu[i].name << " " << stu[i].score << endl;
	
	return 0;
 

成绩排序2(双关键字排序)

https://www.noobdream.com/DreamJudge/Issue/page/1159/

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 110;

struct Stu 
	int id;
	int score;
	
	bool operator < (const Stu &w) const 
		if(score != w.score)
			return score < w.score;
		else 
			return id < w.id;
	
 stu[N];

int main() 
	int n;
	cin >> n;
	
	for(int i = 0; i < n; i ++) 
		cin >> stu[i].id >> stu[i].score;
	
	
	sort(stu, stu + n);
	
	for(int i = 0; i < n; i ++) 
		cout << stu[i].id << " " << stu[i].score << endl;
	
	return 0;

数字排序(双关键字排序)

https://blog.csdn.net/horizon_7887/article/details/128911379

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;

int n;
struct node 
	int a;
	int sum; //sum是各位和 
	//从大到小排序,重载大于号 
	bool operator > (const node &w) const 
		if(sum == w.sum)
			return a < w.a;
		return sum > w.sum;
	 	
 p[N];

//计算各位和 
int add_sum(int a) 
	int sum = 0;
	while(a) 
		sum += a % 10;
		a /= 10;
	
	return sum;


int main() 
	cin >> n;
	for(int i = 0; i < n; i ++) 
		cin >> p[i].a;
		p[i].sum = add_sum(p[i].a);
	
		
	sort(p, p + n, greater<node>()); //从大到小排序加参数 greater<node>()
	
	for(int i = 0; i < n; i ++) 
		cout << p[i].a << " " << p[i].sum << endl;
	
	return 0;
 

进制转换(进位制,高精度除法)

https://www.noobdream.com/DreamJudge/Issue/page/1178/

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> div(vector<int> &A, int b, int r) 
	vector<int> C;
	for(int i = A.size() - 1; i >= 0; i --) 
		r = r * 10 + A[i];
		C.push_back(r / b);
		r = r % b;	
	
	reverse(C.begin(), C.end());
	while(C.size() > 1 && C.back() == 0) 
		C.pop_back();
	return C;


int main() 
	string c;
	while(cin >> c) 
		vector<int> A;
		
		for(int i = c.size() - 1; i >= 0; i --) 
			A.push_back(c[i] - '0');	
		
		string res;
		while(true) 
			res = res + to_string(A[0] % 2);
			A = div(A, 2, 0);
			if(A.size() == 1 && A[0] == 0)
				break; 
		
		
		for(int i = res.size() - 1; i >= 0; i --)
			cout << res[i];
			
		cout << endl;
	
	
	return 0;

打印日期

https://www.noobdream.com/DreamJudge/Issue/page/1410/

#include <iostream>
using namespace std;

int months[13] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

int is_leap(int year) 
	if(year % 100 != 0 && year % 4 == 0 || year % 400 == 0)
		return 1;
	return 0;	


int main() 
	int y, s;
	while(cin >> y >> s) 
		int d = 0, m = 1;
		if(is_leap(y))
			months[2] = 29;
		else
			months[2] = 28;
			
		while(s --) 
			d ++;
			if(d > months[m]) 
				d = 1;
				m ++;
				if(m > 12) 
					m = 1;
					y ++;
				
			
			
				
		printf("%04d-%02d-%02d\\n", y, m, d);
		
	
	return 0;
 

日期累加

https://www.noobdream.com/DreamJudge/Issue/page/1446/
枚举a会超时,枚举m不会

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;


const int N = 1010;
int month[13] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

int is_leap(int year) 
	if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	return 0;


int main() 
	int T, y, m, d, a;
	cin >> T;
	while(T --) 
		cin >> y >> m >> d >> a;
		is_leap(y) == 1 ? month[2] = 29 : month[2] = 28;	
		d += a;
		//枚举月份
		while(d > month[m]) 
			d -= month[m];
			m ++;

			if(m > 12) 
				y ++;
				m = 1;	
				is_leap(y) == 1 ? month[2] = 29 : month[2] = 28;	
			
		 		
		printf("%4d-%02d-%02d\\n", y, m, d);
	
	
	return 0;
 

《考研机试》机试题精讲

1.题(一)

技术图片

 

解析:

  只需要知道一个三位数k:个位 = k%10

               十位 = k/10%10

               百位 = k/100 

代码:

#include<iostream>
using namespace  std;

int main() {
	for(int i=100; i<1000; i++){
		int gewei = i%10;
		int shiwei = i/10%10;
		int baiwei = i/100;
		int sum = (gewei*gewei*gewei)+(shiwei*shiwei*shiwei)+(baiwei*baiwei*baiwei);
		if( i==sum ){
			cout << i << " ";
		}
	} 
	return 0;
}

2.题(二)

技术图片

 

 解析:两种思路:1.i,j两个指针,插入排序,i是j的前面,如果i,j一样,那么j++跳过重复元素

         2.i,j两个指针使用辅助数组,辅助数组b大小=原数组a,刚开始赋值b[0]=a[0],从0开始比较,如果相等原数组指针i++,否则存到辅助数组里去

代码:

#include<iostream>
using namespace  std;

void deleteSame1(int a[], int n){
	int i, j;//定义2个指针 
	for(i=0, j=1; j<n; j++){//i指向前一位,j指向后一位 
	
		if( a[i]!=a[j] ){//前后不相等 
			a[++i] = a[j];//相当于a[++0]=a[1]即a[1]=a[1],不变 
		}
		//否则前后相等,j++,i不变,即相当于跳过 
	}
	//打印 
	for(int k=0; k<=i; k++){
		cout << a[k] << " ";
	}
}

void deleteSame2(int a[], int n){
	int *b = new int[n];//辅助数组 
	int i=0, k=0;
	b[0] = a[0];//第一位等于原数组a第一位
	while(i<n){
		if( a[i]==b[k] ){//前后相等不存取 
			i++;
			continue;
		}else{//不相等存到辅助数组里 
			b[++k] = a[i++]; 
		}
	}
	//打印 
	for(int j=0; j<=k; j++){
		cout << b[j] << " ";
	} 
} 

int main() {
	int a[9] = {7,10,10,21,30,42,42,42,51};
	deleteSame1(a, 9);//方法1 
	deleteSame2(a, 9);//方法2 
	return 0;
}

3.题(三)

技术图片

 

 技术图片

 

 解析:找到叶子节点 = 全部节点 — 非叶子节点

    如果一个结点序号i,只要有结点的parent == i,那么结点i就是非叶子节点

代码:

#include<iostream>
using namespace std;
#define MAX_TREE_SIZE 100

//结点结构体: 
typedef struct {
	char data; //结点数据域
	int parent; //结点双亲在数组中的位置
} PTNode;

//树结构体: 
typedef struct {
	PTNode nodes[MAX_TREE_SIZE];  //存储树中所有的结点
	int n; //树中的结点数,n 不超过 100
}PTree;

/*
算法思想:
		  遍历结点数组,当该结点的序号有另外一个节点指向时,那么该结点为非叶节点,
		  当遍历完结点时,没有一个结点的指针指向该序号的话,那么该结点即是叶结点。
*/

//返回树中叶子结点个数=节点数目-非叶子节点数目 
int GetLeavesCount(PTree T) {
	int count = 0;//统计非叶结点的个数,转换一下思考方式,否则很难直接统计叶结点个数
	//非叶子节点:只要是有其他结点指向该结点就是非叶子结点 
	for(int i=0; i<T.n; i++){ 
		for (int j=0; j<T.n; j++) {
			if (i == j){//自己指向自己不算
			   continue;
			}else if (T.nodes[j].parent == i) {
				count++;
				break;//break是因为一个结点有许多孩子,count只要加一次 
                     //count统计的是非叶子结点 
			}
		}
	} 
	return T.n-count;
}

int main() {
	cout << "请输入树的结点的个数";
	int n = 0;
	cin >> n;
	PTree pt;
	pt.n = n;
	cout << "请输入每个结点的信息:" << endl;
	for (int i = 0; i < n; i++) {//输入结点的数据域和结点双亲在数组中的位置
		cin >> pt.nodes[i].data;//数据 
		cin >> pt.nodes[i].parent;//父节点位置 
	}
	int leaves=GetLeavesCount(pt);
	cout << "叶子节点数目=" << leaves << endl;
	return 0;
}

 

以上是关于考研机试题 -- 排序进位制日期的主要内容,如果未能解决你的问题,请参考以下文章

《考研机试》机试题精讲

12进制转10进制再转2进制华中科技大学考研机试题

《考研机试》机试题精讲

华科考研机试题阶乘

九度oj题目&amp;吉大考研10年机试题全解

华科考研机试题最长&最短文本