C++编程 神奇的数字村

#无法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

基于Monster 组和GPT的调写:

img

  • 先分别写出判断一个数是否为质数、完美数、水仙花数和波浪数的函数,然后遍历输入的数字,对每个数字分别调用这些函数进行判断。如果有任意一个函数返回 true,则说明该数字可以通过申请,将其存入一个数组中。最后对这个数组进行排序并输出即可。


#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就可以了