题目:
题目背景
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;
}
这就是本题解,谢谢观看。