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

news2024/11/18 6:06:51

数位排序【第十三届】【省赛】【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.coloradmin.cn/o/1338241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java—Throwing Exceptions

一、指定方法引发的异常 上一节展示了如何为ListOfNumbers类中的writeList&#xff08;&#xff09;方法编写异常处理程序。有时&#xff0c;代码捕获可能在其中发生的异常是适当的。然而&#xff0c;在其他情况下&#xff0c;最好让调用堆栈更上层的方法处理该异常。例如&…

echarts自定义鼠标移上去显示,自定义图例,自定义x轴显示

提示&#xff1a;记录一下echarts常用配置,以免后期忘记 1.自定义鼠标移上去效果 tooltip: { show: true, trigger: "axis", axisPointer: { type: "shadow",//默认自定义效果 }, // //自定义鼠标移上去效果 formatter: (v) > { console.log("打印…

postman入门使用

前言 对于postman的基础其实很容易上手实现&#xff0c;也有很多教程。 对于小编我来说&#xff0c;也基本可以实现开发任务。 但是今年我们的高级测试&#xff0c;搞了一下postman&#xff0c;省去很多工作&#xff0c;让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

云计算:OpenStack 配置二层物理网卡为三层桥的接口

目录 一、理论 1.OpenStack 二、实验 1. Linux系统修改网卡 2.OpenStack 配置二层物理网卡为三层桥的接口 一、理论 1.OpenStack &#xff08;1&#xff09;概念 OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。由NASA(美国国家航空…

7.3 uvm_config_db in UVM

uvm_config_db类派生自uvm_resource_db类。它是uvm_resource_db顶部的另一层便利层&#xff0c;简化了用于uvm_component实例的基本接口&#xff08;资源库的访问方法&#xff09;。 下面uvm_config_db类的代码段取自uvm源代码。 class uvm_config_db#(type Tint) extends uv…

Spring Boot:Spring Boot 入门、yaml 配置文件给属性赋值、自动装配原理详解

文章目录 Spring Boot - 01一、概述二、第一个 Spring Boot 程序补充知识 三、配置文件1. yaml 配置文件2. 使用 yaml 配置文件给属性赋值3. 松散绑定以及数据校验4. 配置文件的位置以及多环境配置 四、Spring Boot 分析1. pom.xml2. 启动器3. 主程序4. 自动装配原理5. 主启动类…

后缀表达式C语言

解析&#xff1a; 我们把数组排序&#xff0c;把较大的数字相加&#xff0c;较小的数字也相加&#xff0c;在做差就得到结果。 #include <stdio.h> int main(){int m,n,j,i;scanf("%d%d",&n,&m);//n个加号&#xff0c;m个减号。 int num[nm1];for(i0…

虹科方案丨L2进阶L3,数据采集如何助力自动驾驶

来源&#xff1a;康谋自动驾驶 虹科方案丨L2进阶L3&#xff0c;数据采集如何助力自动驾驶 原文链接&#xff1a;https://mp.weixin.qq.com/s/qhWy11x_-b5VmBt86r4OdQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 12月14日&#xff0c;宝马集团宣布&#xff0c;搭载…

Ubuntu20.04配置

新建用户 sudo adduser username给用户sudo权限 新创建的用户没有root权限&#xff0c;我们执行以下命令给用户sudo权限 sudo usermod -a -G adm username sudo usermod -a -G sudo username删除用户 删除用户及用户所有文件&#xff08;/home/username/路径下的所有文件&a…

【2023-12-14】 最新瑞幸咖啡小程序-blackbox

需要联系主页V 瑞幸咖啡小程序 登入需要过同盾滑块下单需要balckbox参数 测试 下单 过滑块 登入发短信 加密参数

FPGA高端项目:12G-SDI 视频编解码,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、详细设计方案设计框图UltraScale GTH 的SDI模式应用UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale GTH 发送接口UltraScale G…

【centos】【golang】安装golang

下载安装包 方法1&#xff1a; 打开 https://go.dev/dl/ &#xff1b;点击下载golang的安装包&#xff1b;再使用ssh传到centos上&#xff08;略&#xff09; 方法2&#xff1a;能使用Google就可以这样 wget https://dl.google.com/go/go1.21.5.linux-amd64.tar.gz解压安装包…

亿赛通电子文档安全管理系统 dump任意文件读取漏洞(CNVD-2023-09184)

产品简介 亿赛通电子文档安全管理系统&#xff0c;&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资…

unityc用vs2017介绍

21版unity能用17vs&#xff0c;只要在unity的Edit/Preferences/ExternalTools里面改既可。

记一次应急响应练习(windows)

记一次应急响应练习&#xff08;windows&#xff09; windows&#xff1a; 1.请提交攻击者攻击成功的第一时间&#xff0c;格式&#xff1a;YY:MM:DD hh:mm:ss 答&#xff1a;2023/04/29:22:44:32 思路&#xff1a; 看见桌面的小皮面板&#xff0c;进入小皮的安装目录。发现…

[Linux]Ubuntu noVNC使用

又到了逛大型程序员交友 网站的时间了&#xff0c;今天你准备好了吗。 今天要推荐的一个有趣的项目是noVNC setup好以后是这个样子的&#xff0c;可以在浏览器登陆vnc&#xff0c;不需要再安装一个vnc client. setup的过程比较简单&#xff0c;分为以下几步&#xff1a; 1. v…

Spring中常见的BeanFactory后处理器

常见的BeanFacatory后处理器 先给出没有添加任何BeanFactory后处理器的测试代码 public class TestBeanFactoryPostProcessor {public static void main(String[] args) {GenericApplicationContext context new GenericApplicationContext();context.registerBean("co…

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…

QuPath病理流程学习 ③ IHC、HE (WSI的处理)实战

示例数据 示例样本获取&#xff0c;里面有HE和IHC两种切片数据 Hamamatsu NDPI (cmu.edu) Cell detection — QuPath 0.5.0 documentation 在QuPath中&#xff0c;病理选择Brightfield H&E和Brightfield DAB代表了不同的染色方式。H&E代表了Hematoxylin and Eosin&am…

简化报表设计器Fastreport 中 TableObject 的工作

在 2024.1 更新之前&#xff0c;要添加行或列&#xff0c;您必须在属性面板中查找所需的属性并设置所需的值。如果您想要在表格末尾以外的位置插入行或列&#xff0c;则必须手动传输所有单元格值。此外&#xff0c;要传输值&#xff0c;需要打开编辑器&#xff0c;复制值&#…