东测试开发笔试题(C++)

记录一下

1、抽象后的题目:取出由仅由素数2,3,5组成的从小到大的第n个数,包括2,3,5 ,222,2355,223355,等数。

解题思路:
在这里插入图片描述

因为当时刚开始考虑时就用了vector和循环,所以最后的代码简直相当赘述,第一个是笔试时考虑的,第二个是下来之后修改的

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

int findN(int n) {
	vector<int> orgin{ 2,3,5 };
	int count = 0;
	vector<int> tmp{ 2,3,5 };
	vector<int> v;
	v.push_back(2);
	v.push_back(3);
	v.push_back(5);
	for (int i = 3; i < n; ) {
		int len = tmp.size();
		for (int j = 0; j < len; ++j) {
			for (int k = 0; k < orgin.size(); ++k) {
				if (tmp[j] != 0) {
					int m = tmp[j] * 10 + orgin[k];
					tmp.push_back(m);
					v.push_back(m);
					count++;
				}
			}
			tmp[j] = 0;
		}
		i += count;
		count = 0;
	}
	return v[n - 1];
}
int main() {
	int n;
	while (cin >> n) {
		if (n <= 1000) {
			int num = findN(n);
			cout << num << endl;
		}
	}
	system("pause");
	return 0;
}

之后考虑用队列实现每次得到的数,然后将用过的数出队列,并且每次一个之前的数与2,3,5组合后,判断是否到达了需要求得的第n个数。比起上面的代码好看太多。

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int findN(int n) {
	vector<int> orgin{ 2,3,5 };
	queue<int> q;
	q.push(2);
	q.push(3);
	q.push(5);
	vector<int> result{ 2,3,5 };
	int count = 3;
	while(count <= n && !q.empty()) {
		//取出队列的第一个元素与2,3,5匹配,然后将其出队列
		int tmp = q.front();
		q.pop();
		for (int i = 0; i < orgin.size(); ++i) {
			int m = tmp * 10 + orgin[i];
			q.push(m);
			result.push_back(m);
			count++;
		}
	}
	return result[n - 1];
}
int main() {
	int n;
	while (cin >> n) {
		if (n <= 1000) {
			int num = findN(n);
			cout << num << endl;
		}
	}
	system("pause");
	return 0;
}

2、将十进制逆序(需要去掉前导0),然后转化为五进制正整数输出。

都是用的笨方法做的,先求余vector,然后每次取出来乘以10^i(i是vector的下标),得到逆序后的数,继续与5求余,得到最终五进制整数的位数放入vector,继续取出组合成正整数

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int t_f(int n) {
	int result =0;
	int tmp = 0;
	vector<int> ret;
	//如果输入数只有一位不需要逆序
	if (n <= 9) {
		tmp = n;
	}
	//否则逆序
	else {
		while (n) {
			ret.push_back(n % 10);
			n = n / 10;
		}
	}
	int len = ret.size();
	int k = len -1;
	//将逆序后的数转为int
	for (int i = 0; i < len; i++) {
		tmp += ret[i] * pow(10, k);
		k--;
	}
	vector<int> ret_s;
	//求五进制数
	while (tmp) {
		ret_s.push_back(tmp % 5);
		tmp = tmp / 5;
	}
	int len_s = ret_s.size() -1;
	for (int j = ret_s.size() - 1; j >= 0; j--) {
		result += ret_s[j] * pow(10,len_s);
		len_s--;
	}
	return result;
}
int main() {
	int n;
	while (cin >> n) {
		if (n <= 100000) {
			int result = t_f(n);
			cout << result << endl;
		}
	}
	system("pause");
	return 0;
}

提醒自己:代码提交一定记得去掉system(“pause”);,有好几次忘记去掉这一句代码通过不了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值