#无法AC,深深的无力感,c++编程题目求解
在某一个虚拟的世界里,有一个神奇的村庄,人们叫它“神奇的数字村”。一开始,这个村子只有两个数0和1,它们也是这个村的领袖。要知道,0和1可是虚拟世界里最有魅力的数字了,因此,这个村庄也吸引了很多其他的数字申请在这里定居。然而,可不是什么数字都可以在这里定居的,0和1定下了一个规矩:只有至少拥有一个特殊标签的数字才可以通过申请。标签有:
1、质数:哪些数能拥有这个标签,就不用我赘述了吧;
2、完美数:如果一个数所有约数的和(除去它本身)正好等于这个数,它可以拥有“完美数”标签,如:6=1+2+3;
3、水仙花数:“水仙花数”是指一个数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3;
4、波浪数:波浪数指的是由两个不同的数字交替出现的数(至少是三位数),如:121、1212、12121;
已知有n个数字申请在“神奇的数字村”定居(有的数字可能重复申请),请你最终确定有哪些数能通过申请,将他们从小到大输出来。
输入格式
输入包括两行:
第一行包括一个正整数n(1<=n<=1000);
第二行包括n个自然数x(1<x<=1000)
输出格式
输出只有一行,从小到大输出通过申请的数字,两个数字之间用空格隔开。
数字1比较调皮,偶尔自己也会提交个申请,算他通过吧。
输入样例 复制
5
101 6 2 10 313
输出样例 复制
2 6 101 313
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 判断一个数是否为质数
bool is_prime(int n) {
if (n < 2) return false;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) return false;
}
return true;
}
// 判断一个数是否为完美数
bool is_perfect(int n) {
int sum = 1;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
sum += i;
if (i != n / i) sum += n / i;
}
}
return sum == n;
}
// 判断一个数是否为水仙花数
bool is_narcissistic(int n) {
int sum = 0, m = n;
while (m) {
int d = m % 10;
sum += d * d * d;
m /= 10;
}
return sum == n;
}
// 判断一个数是否为波浪数
bool is_wave(int n) {
string s = to_string(n);
int len = s.length();
if (len < 3) return false;
bool flag = s[0] != s[1];
for (int i = 2; i < len; i++) {
if (s[i] == s[i-1] || s[i] == s[i-2]) {
flag = false;
break;
} else if (s[i-1] == s[i-2]) {
flag = true;
}
}
return flag;
}
int main() {
int n;
cin >> n;
vector<int> res;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x == 1 || is_prime(x) || is_perfect(x) || is_narcissistic(x) || is_wave(x)) {
res.push_back(x);
}
}
sort(res.begin(), res.end());
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
return 0;
}
这个题思路感觉你开一个1001的数组,然后对这1000内的数按顺序执行,那个质数用欧拉筛选法,是质数的就用给数组置1,然后其他的几个方法判断时如果是1就跳过。查询的时候只用判断数组里对应的元素是不是1就可以了