记录一下
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”);,有好几次忘记去掉这一句代码通过不了