蓝桥杯c/c++程序设计——数位排序

数位排序【第十三届】【省赛】【C组】

题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。

当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。

例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。

又如,6 排在 2022 前面,因为它们的数位之和相同,而 6小于 2022。

给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?

输入格式
输入第一行包含一个正整数 n。

第二行包含一个正整数 m。

输出格式
输出一行包含一个整数,表示答案。

数据范围
对于 30% 的评测用例,1 ≤ m ≤ n ≤ 300
对于 50% 的评测用例,1 ≤ m ≤ n ≤ 1000
对于所有评测用例,1 ≤ m ≤ n ≤ 1e6

输入样例:

13
5

输出样例:

3

样例解释
1 到 13 的排序为:1,10,2,11,3,12,4,13,5,6,7,8,9。

第 5 个数为 3。
 

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+1;
int sum(int x)
{
	int sum=0;
	while(x>0)
	{
		sum = sum+x%10; // 将 x 的个位数字加到 sum
		x=x/10; // 将 x 的数字右移一位
	}
	return sum; // 返回 x 的各位数字之和
}
int cmp(int a,int b)
{
	int sumA=sum(a); // 计算 a 的各位数字之和
	int sumB=sum(b); // 计算 b 的各位数字之和
	if(sumA!=sumB) // 如果 a 和 b 的各位数字之和不相等
	{
		return sumA<sumB; // 返回 a 的各位数字之和是否小于 b 的各位数字之和
	}
	else
	{
		return a<b; // 返回 a 是否小于 b
	}
}

int main()
{
	int a,b;
	scanf("%d\n",&a); // 输入第一个整数 a
	scanf("%d",&b); // 输入第二个整数 b
	int n[100001]={0}; // 声明一个数组 n,长度为 100001,并初始化为 0
	for(int i=1;i<=a;i++) // 从 1 到 a 进行循环
	{
		n[i]=i; // 将数组中的第 i 个元素设置为 i
	}
	sort(n+1,n+a+1,cmp); // 使用 cmp 函数对数组 n 进行排序,从下标 1 开始,到 a 结束
	printf("%d",n[b]); // 输出排序后,第 b 个元素
	return 0;
}

这段代码是一个对数字进行排序的程序。它首先定义了一个求一个整数各位数字之和的函数sum(int x),然后定义了一个比较函数cmp(int a, int b),根据两个数字的各位数字之和进行比较,如果各位数字之和不同,则返回较小的数字,如果各位数字之和相同,则返回较小的数字。在main函数中,用户输入两个整数ab,然后声明一个长度为100001的整型数组n,将数组初始化为从1到a的整数。然后使用std::sort函数对数组进行排序,排序的依据是调用cmp函数进行比较。最后输出排序后的第b个数字。

分析代码

#include<iostream>
#include<algorithm>
using namespace std;

这是引入所需的库。

const int N=1e6+1;

定义一个常量 N,赋值为 1e6+1,即 1000001。

int sum(int x)
{
	int sum=0;
	while(x>0)
	{
		sum = sum+x%10; // 将 x 的个位数字加到 sum
		x=x/10; // 将 x 的数字右移一位
	}
	return sum; // 返回 x 的各位数字之和
}

这是定义了一个函数 sum(int x),用于计算一个整数各位数字之和。函数内部使用了循环和取模运算来逐个获取 x 的各位数字,然后将其累加到变量 sum 中,最后返回 sum。

int cmp(int a,int b)
{
	int sumA=sum(a); // 计算 a 的各位数字之和
	int sumB=sum(b); // 计算 b 的各位数字之和
	if(sumA!=sumB) // 如果 a 和 b 的各位数字之和不相等
	{
		return sumA<sumB; // 返回 a 的各位数字之和是否小于 b 的各位数字之和
	}
	else
	{
		return a<b; // 返回 a 是否小于 b
	}
}

 

  1. 如果两个整数的数位之和不相等,则比较它们的数位之和:数位之和较小的整数更小,返回 true
  2. 如果两个整数的数位之和相等,则比较它们的大小:较小的整数更小,返回 true;否则返回 false

这个 cmp 函数可以用于对数组进行排序,以实现题目要求。

这是定义了一个比较函数 cmp(int a, int b),用于在排序时作为比较的依据。函数内部首先调用了 sum 函数计算 a 和 b 的各位数字之和,然后进行比较。如果 a 和 b 的各位数字之和不相等,返回 a 的各位数字之和是否小于 b 的各位数字之和;如果 a 和 b 的各位数字之和相等,返回 a 是否小于 b。

不过请注意,您可能需要事先声明 sum 函数,或者将其放在 cmp 函数的前面,以确保函数之间的调用关系正确。

上面这段代码不太好理解

可以换成下面这个代码:


int cmp(int a,int b)
{
	int sumA=sum(a);
	int sumB=sum(b);
	if(sumA!=sumB)
	{
		if(sumA<sumB)
		{
			return true;
		}
		else
		{
			return false;
		}
		
	}
	else
	{
		if(a<b)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
 } 

这样就比较好理解了 

int main()
{
	int a,b;
	scanf("%d\n",&a); // 输入第一个整数 a
	scanf("%d",&b); // 输入第二个整数 b
	int n[100001]={0}; // 声明一个数组 n,长度为 100001,并初始化为 0
	for(int i=1;i<=a;i++) // 从 1 到 a 进行循环
	{
		n[i]=i; // 将数组中的第 i 个元素设置为 i
	}
	sort(n+1,n+a+1,cmp); // 使用 cmp 函数对数组 n 进行排序,从下标 1 开始,到 a 结束
	printf("%d",n[b]); // 输出排序后,第 b 个元素
	return 0;
}

这是程序的主函数 main。首先定义了两个整数变量 a 和 b,然后通过 scanf 函数分别输入这两个整数。接着声明了一个长度为 100001 的整型数组 n,并将其所有元素初始化为 0。

接下来,使用 for 循环将数组 n 的元素从 1 到 a 逐个赋值为对应的值 i。

最后,使用 sort 函数对数组 n 进行排序,排序的依据是调用 cmp 函数进行比较。排序的范围是从下标 1 开始,到下标 a 结束。

最后,使用 printf 函数输出排序后的第 b 个元素。

	sort(n+1,n+a+1,cmp);

整个程序的作用是,根据用户输入的两个整数 a 和 b,将从 1 到 a 的整数进行排序,排序的依据是各个数字的各位数字之和和大小。然后输出排序后的第 b 个数字。

这行代码使用了 <algorithm> 头文件中的 sort 函数对数组 n 进行排序。下面对该代码进行具体解释:

sort(n+1,n+a+1,cmp);

  • n+1: 表示指向数组 n 的第二个元素的指针(下标为 1)。
  • n+a+1: 表示指向数组 n 的第 a+1 个元素的指针(下标为 a+1)。这里的 a 是用户输入的第一个整数。
  • cmp: 表示排序时使用的比较函数,即上文中定义的 cmp 函数。

该语句的作用是将数组 n 从第二个元素(下标为 1)开始,到第 a+1 个元素(下标为 a+1)结束的元素进行排序。排序的规则是根据 cmp 函数中所定义的比较方式进行排序。排序后,数组 n 中的元素将按照定义好的规则重新排列。

注意,在这里排序的范围是从 1 开始,而不是从 0 开始,因为在这个程序中数组 n 的第一个元素是无效的(初始化为 0),所以从第二个元素开始排序。同时,为了包括第 a 个元素,排序范围到第 a+1 个元素结束。

排序结束后,数组 n 将按照 cmp 函数中定义的规则进行排序的结果。

sort() 是 C++ 标准库中的一个排序算法函数,用于对指定范围内的元素进行排序。

sort() 的函数签名如下:

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);

其中,RandomAccessIterator 是一个迭代器类型,用于指定待排序范围的起始位置和结束位置。first 是待排序范围的起始位置的迭代器,last 是待排序范围的结束位置的迭代器,表示右边界(不包含在排序范围内)。

sort() 函数使用的是快速排序算法(平均时间复杂度为 O(n log n))。下面是 sort() 函数的伪代码实现:

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last)
{
    if (first != last && std::distance(first, last) > 1) {  // 如果范围内的元素数量大于 1
        RandomAccessIterator pivot = std::partition(first + 1, last, std::bind2nd(std::less<typename std::iterator_traits<RandomAccessIterator>::value_type>(), *first));
        std::iter_swap(first, pivot - 1);  // 将枢纽元放到正确的位置上
        sort(first, pivot - 1);  // 对左半边范围进行排序
        sort(pivot, last);  // 对右半边范围进行排序
    }
}

sort() 函数使用了 std::partition() 函数来对待排序范围进行划分,将小于枢纽元的元素移到枢纽元的左边,大于枢纽元的元素移到枢纽元的右边。然后递归地对左半边和右半边范围进行排序,直到范围内的元素数量小于等于 1。

需要注意的是,sort() 函数仅保证元素的相对顺序是有序的,而不保证稳定性(相同元素的相对顺序可能会改变)。如果需要保持相同元素的相对顺序不变,可以使用稳定排序算法,比如 std::stable_sort()。

请注意,sort() 的实现可能会因为不同的编译器和标准库而略有不同,伪代码仅用于描述大致实现思路。真正的 sort() 源码可能会更加复杂且具有优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/269814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAD objectArx 在操作mfc时出现“不支持尝试执行的操作“

问题原因&#xff1a; ARX中对话框通常继承自CAcUiDialog&#xff0c;CAcUiDialog 构造函数有个参数 HINSTANCE hInstance&#xff0c;默认为 NULL&#xff0c;指定了对话框资源所在DLL进程。如果没有指定该参数&#xff0c;在创建对话框&#xff08;DoModal或Create&#xff…

竞赛保研 基于RSSI的室内wifi定位系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; wifi室内定位系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;…

ip addr和ifconfig

ip addr可以显示更多信息&#xff0c;包括为启动的网络驱动如wlan&#xff0c;而ifocnfig只显示在线的驱动。若wlan是down的&#xff0c;则ip addr会显示信息&#xff0c;ifconfig不会显示信息。 ip addr: ifconfig:

网络通信协议

WebSocket通信 WebSocket是一种基于TCP的网络通信协议&#xff0c;提供了浏览器和服务器之间的全双工通信&#xff08;full-duplex&#xff09;能力。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff…

定制TikTok引流脚本必备功能!

在TikTok的海洋中&#xff0c;如何让你的品牌或产品脱颖而出?除了内容创新&#xff0c;一个高效的TikTok引流脚本也是关键&#xff0c;本文将为你揭示定制TikTok引流脚本必备的四大功能&#xff0c;助你在这场流量大战中占得先机。 一、消息多发 在TikTok上&#xff0c;消息…

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

鸿蒙的基本入门理解

一、鸿蒙工具的安装&#xff1a; 1、安装&#xff1a;官网 按照官网的步骤&#xff0c;按照好后&#xff0c;可以直接使用previewer预览就可以了【刚入门&#xff0c;不建议大家搞得太多&#xff0c;容易晕】。 如果预览不了&#xff0c;再安装模拟器 2、新建项目&#xff…

企业门户平台全功能解析:从界面到集成,一站式管理与整合

引言 在当今信息时代&#xff0c;企业门户平台作为企业信息化的重要支柱&#xff0c;扮演着连接各项业务、整合数据、提升工作效率的关键角色。它不仅是一个信息集成的平台&#xff0c;更是促进团队协作、提高工作效率的利器。本文将探讨企业门户平台在信息整合和工作效率方面…

故障管理过程

故障管理 故障管理在故障生命周期中的位置 分维度统计分析规律&#xff0c;形成系统化的改进方向跟进每个case的改进方案&#xff0c;彻底消除隐患前事不忘后事之师&#xff0c;供后续参考 故障定级 事故级别服务级别一般事故严重事故重大事故特大事故对外完全停止服务时间一…

大模型工具:LangChain 原理与实战案例

LangChain 是什么&#xff1f; LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使得可以构建以下类型的应用程序&#xff1a; 数据感知&#xff1a;将语言模型与其他数据源连接起来 智能&#xff1a;允许语言模型与其环境进行交互 LangChain的主要价值在于&…

亚信安慧AntDB数据库携手U8C共创未来

AntDB数据库生态负责人在近期举行的商业创新大会上引领着数字化时代的浪潮&#xff0c;推出了令业界瞩目的U8CAntDB联合产品。这一创新性的合作将AntDB数据库与U8C云ERP产品紧密结合&#xff0c;为成长型企业提供了一套全栈、安全可靠的保障&#xff0c;为企业的数智化转型升级…

新/旧版本 QT 下载,全攻略【省资源下载币专用】

看到好多朋友找不到指定版本的QT下载路径&#xff0c;特此更新一篇新/旧版本 QT 下载攻略 收藏一下吧&#xff0c;需要的时候方便查找&#xff0c;能为你省下好多资源下载币。 通过图示可以看出&#xff0c;新旧版本的界限并没有那么明晰&#xff0c;如果你需要的版本两个链接…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

内网MSF--从入门到熟练

Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework&#xff0c;简称叫做MSF。Metasploit 作为全球最受欢迎的工具&#xff0c;不仅仅是因为它的方便性和强大性&#xff0c;更重要的是它的框架。它允许使用者开 发自己的漏洞脚本&#xff0c;从而进行测试。 一…

python实现多层级复选框选中

pythonpyqt5实现多层级复选框选中 效果如何插入一段漂亮的代码片 效果 如何插入一段漂亮的代码片 去博客设置页面&#xff0c;选择一款你喜欢的代码片高亮样式&#xff0c;下面展示同样高亮的 代码片. // An highlighted block class filterWindow(QWidget):def __init__(sel…

路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

路径规划综述 1. 背景介绍 路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用&#xff0c;包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展&#xff0c;路径规划技术也在不断地得到改进和应用。 路径规划…

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界&#xff0c;揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy&#xff0c;助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts&#xff0c;本书呈现生动直…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中&#xff0c;玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏&#xff0c;它不仅提供了一个有趣的辨色挑战&#xff0c;还能帮助玩…

[C/C++]数据结构: 链式二叉树的构建及遍历

一: &#x1f4ac;二叉树的概念 1.1:&#x1f6a9; 概念 二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…
最新文章