幸运数排序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;
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值