首页 > 其他分享 >蓝桥杯(拼数

蓝桥杯(拼数

时间:2024-12-03 19:28:24浏览次数:6  
标签:char 拼数 int elem2 connect2 connect1 蓝桥 elem1

拼数

问题描述

给定 n 个正整数 a1,a2,…,an,你可以将它们任意排序。

现要将这 n 个数字连接成一排,即令相邻数字收尾相接,组成一个数。

问,这个数最大可以是多少。

输入格式

第一行输入一个正整数 n(1≤n≤20)。

第二行输入 n 个正整数 a1,a2,…,an​(1≤ai≤10^5)。

输出格式

输出一个整数,表示答案。

样例输入

3
13 312 343

样例输出

34331213

 思路

本题如果我们选择以整型变量存储数字,会发现我们需要处理各数字的较高位,十分麻烦,所以我们不妨以字符串形式存储,这样我们就可以使用strcmp()函数逐位比较数字大小。

于是这里我们选择直接使用qsort()对数组进行排序,需要注意的是如果我们直接通过比较两个数的大小进行排序:

int compare(const char* elem1,const char* elem2){
  return strcmp(*(char**)elem2,*(char**)elem1);
}

那么我们不难发现当输入为:

3
87 876 12

会输出:

8768712

 这与我们想要的:8787612不符。

为了解决这个问题,我们可以先将两数按不同顺序连接起来,再通过比较连接过后的数来进行排序:

int compare(const char* elem1,const char* elem2){
  // 直接将void*转换为char*,因为elem1和elem2是指向字符串指针的指针
  char* str1 = *(char**)elem1;
  char* str2 = *(char**)elem2;
  // 拼接后最大长度为12,再加上一个终止符,所以这里需要13个字符的空间
  char connect1[13];
  char connect2[13];
  //将两数通过snprintf()函数以不同顺序进行连接
  snprintf(connect1, sizeof(connect1),"%s%s",str1,str2);
  snprintf(connect2, sizeof(connect2),"%s%s",str2,str1);
  //比较连接后的两个字符串,从大到小排序
  return strcmp(connect2,connect1);
}

得到正确答案:

8768712

 Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const char* elem1,const char* elem2){
  // 直接将void*转换为char*,因为elem1和elem2是指向字符串指针的指针
  char* str1 = *(char**)elem1;
  char* str2 = *(char**)elem2;
  // 拼接后最大长度为12,再加上一个终止符,所以这里需要13个字符的空间
  char connect1[13];
  char connect2[13];
  //将两数通过snprintf()函数以不同顺序进行连接
  snprintf(connect1, sizeof(connect1),"%s%s",str1,str2);
  snprintf(connect2, sizeof(connect2),"%s%s",str2,str1);
  //比较连接后的两个字符串,从大到小排序
  return strcmp(connect2,connect1);
}

int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int n;
  scanf("%d",&n);
  char** c = (char**)malloc(sizeof(char*) * n);
  for(int i = 0;i < n;i++){
    //1≤ai≤10^5,最大为6位数,所以加上一个终止符'\0',共需要7位字符串
    c[i] = (char*)malloc(sizeof(char) * 7);
    scanf("%6s",c[i]);// 以字符串形式读取,限制最大读取长度为6以防止溢出
  }
  qsort(c,n,sizeof(c[0]),compare);// 使用qsort进行排序
  for(int i = 0;i < n;i++){
    printf("%s",c[i]);// 打印每个排序后的字符串,并添加换行符
  }
  return 0;
}

标签:char,拼数,int,elem2,connect2,connect1,蓝桥,elem1
From: https://blog.csdn.net/h1731569379/article/details/144160563

相关文章

  • 蓝桥杯真题中等题第三题刷题统计
    题目链接:https://www.lanqiao.cn/problems/2098/learning/?page=1&first_category_id=1&second_category_id=3&tags=2022,省赛&tag_relation=intersectionJava代码如下:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){......
  • 蓝桥杯c++算法秒杀【7】之数据结构(修改数组、翻转括号序列、双向排序:::非常典型的必刷例
    别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !  关注博主,更多蓝桥杯nice题目静待更新:)  数据结构一、修改数组【问题描述】        给定一个长度为N的数组A=[A1,A2,...,AN],数组中有可能有重复出现的整数。        现在小明要按以下方法将其......
  • 力扣15题——蓝桥杯每日一练(双指针+排序)
    #题目给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。#思路通过排序+双指针完成解题#......
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(6))
    参考程序:#include<bits/stdc++.h>usingnamespacestd;intn;inta[305];intdp[305][305];//打掉ij之间所有靶子可以获得的最大积分(不含i,j)intmain(){cin>>n;for(inti=1;i<=n;i++){cin>>a[i];}a[0]=1;a[n+1]=1;for(inti=n......
  • c语言编程1.17蓝桥杯历届试题-回文数字
    题目描述观察数字:12321,123321都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。本题要求你找到一些5位或6位的十进制数字。满足如下要求:该数字的各个数位之和等于输入的整数。输入格式一个正整数n(10<n<100),表示要求满足的数......
  • 蓝桥杯 买瓜
    思路:解决一个关于选择和处理“瓜”的组合优化问题。给定了一定数量的“瓜”(数量为n),每个“瓜”有其自身的质量(存储在数组a中),需要通过选择和可能的“劈”操作(将瓜的质量减半),使得所选瓜的总质量尽可能接近给定的目标质量m,并输出达到或最接近目标质量所需的最少操作次数......
  • 蓝桥杯备考冲刺必刷题(Python) | 548 时间加法
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】现在时间是a点b分,请问t分钟后,是几点几分?【输入】输入的第一行包含一个整数a。第二行包含一个整数b.第三行包含一个整数t......
  • 蓝桥杯备考冲刺必刷题(Python) | 760 数的计算
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】输入一个自然数n(n≤1000),我们对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超......
  • 第十六届蓝桥杯模拟赛(第二期)c++答案与代码
    一、【问题描述】如果一个数p是个质数,同时又是整数a的约数,则p称为a的一个质因数。请问,2024的最大的质因数是多少?答案:23#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);......
  • 蓝桥云课:求阶乘
    这道题是一道二分的题目,题目让我们找出满足 N !的末尾恰好有 K 个0的最小的 N 是多少?如果这样的 N 不存在输出 −1。一个数的阶乘的尾部有几个0取决于2*5的组数,准确来说是有几个5,因为2的倍数比5的倍数多,所以有几个0取决于有几个5.所以我们可以先写一个函数用来......