幸运数排序c++

题目:

题目背景

Special for beginners, ^_^

题目描述

小明是个很相信玄学(迷信)的人,他每次看电影选座位的时候,总是喜欢选择当天的幸运数字。

他认为凡是和当天日期的最大公约数大于 3 的数字,都是当天的幸运数字,并且幸运数字越大,幸运值就越大;

小明对于普通数字缺乏好感,他认为普通数字应该越小越好。

现在,“心灵之旅”就要开场了,小明查到只剩下超超级巨幕厅最后一排中的 n 个座位(0 < n < 5000),请按照小明的喜好程度,对这些座位进行从大到小排序。

输入格式

第一行有2个整数 n,m,其中 n 代表还剩下的座位数,m代表今天的日期( 1 ~ 31)

第二行连续n(0<n≤5000)个整数,代表座位号(1 ~10的九次方)

输出格式

按小明喜好程度从大到小输出这 n 个座位号,由于系统问题,可能同一座位号会出现多次,依次输出即可。

输入输出样例

输入 #1

7 4
9 2 5 8 10 20 9

输出 #1

20 8 2 5 9 9 10

说明/提示

只有 20 和 8 与 4 的最大公约数大于 3,是幸运数字,其他 2, 5, 9, 10 均为普通数字。

100%的数据保证 ( 0<n≤5000),

这一道题目可以写两个函数,分别是求最大公约数的函数和后面用来自定义排序的函数。

代码(code):

#include<bits/stdc++.h>
using namespace std;
int n,m,a[5001],ans[5001],cnt = 0;
int gcd(int x,int y)
{
    if(y == 0)
    {
        return x;
    }
    return gcd(y,x % y);
}
bool cmp(int x,int y)
{
    if(gcd(x,m) > 3 && gcd(y,m) > 3)
    {
        return x > y;
    }
    if(gcd(x,m) > 3 && gcd(y,m) <= 3)
    {
        return true;
    }
    if(gcd(x,m) <= 3 && gcd(y,m) > 3)
    {
        return false;
    }
    return x < y;
}
int main()
{
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
    }
    sort(a + 1,a + n + 1,cmp);
    for(int i = 1; i <= n; i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

这就是本题解,谢谢观看。

### 幸运的定义 幸运通常是指一类特殊的字,其特性取决于具体的定义方式。常见的两种幸运概念分别基于 **特定字组成** 和 **筛选过程**。 #### 基于特定字组成的幸运 这种类型的幸运由某些特殊字符构成,例如只包含 `4` 和 `7` 的字[^2]。这类幸运可能还需要满足其他条件,比如长度为偶、前后两部分排序后相等等。 #### 基于筛选过程的幸运 另一种幸运通过一种类似于埃拉托色尼筛法的过程来生成。初始序列是从 1 开始的自然列,随后按一定规则逐步删除一些字,最终剩下的字称为幸运[^1]。 --- ### 计算幸运算法 以下是几种常见幸运的计算方法及其对应的实现: #### 方法一:基于特定字组成的幸运判定 此方法用于检测一个给定字是否属于某种形式的幸运(如仅含 `4` 和 `7`)。具体逻辑如下: - 验证字符串长度是否为偶; - 检查该字符串是否完全由指定字符集(如 `'4'` 和 `'7'`)构成; - 将字符串分为前后两个部分并比较它们的有序排列。 下面是 Python 实现代码示例: ```python a = input() if (len(a) % 2 == 0 and len(set(a) - set('47')) == 0 and sorted(a[:len(a)//2]) == sorted(a[len(a)//2:])): print('YES') else: print('NO') ``` #### 方法二:基于 m 进制转换的幸运 这种方法适用于统计某个范围内符合条件的幸运量。假设输入参分别为 k、n 和 m,则可以将 k 转换为以 m 为基表示的形式,并逐一验证每一位上的值是否等于 n 来决定它是否是一个幸运。 下面给出 C++ 版本的伪代码框架作为参考: ```cpp #include <iostream> using namespace std; int main(){ int k, n, m; cin >> k >> n >> m; if(m <= n){ cout << "0"; return 0; } int sum=0,number=k; while(number>0){ if( number%m == n ){ sum++; } number /= m; } cout<<sum; } ``` #### 方法三:动态生成幸运列表 对于更复杂的场景下需要构建完整的幸运集合时,可采用迭代或者递归的方式模拟整个剔除流程直至获得最终结果为止。不过这里不再赘述因为这超出了当前讨论范围[^3]。 --- ### 示例分析 假设有这样一个需求:“判断整9876 是否符合上述提到的第一种类型幸运标准。” 我们可以按照前面介绍的方法一步步操作得出结论——由于它的各位并不全是由‘4’或‘7’所组成所以应该返回否(NO). 而对于第二种情况来说假如我们设定K值为十进制下的十六也就是HEX中的F,N设成五,M选八那么经过一系列运算之后会发现不存在任何一位正好匹配上N的情况因此最后输出也为零(^1). ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值