首页 > 其他分享 >洛谷P1012 拼数 C语言

洛谷P1012 拼数 C语言

时间:2024-07-19 21:25:47浏览次数:15  
标签:13 洛谷 && 拼数 len C语言 135 字符串 input

这个题可以用字符串去做,接受字符来去计算大小,这里可以用到strcmp函数

str1 = "123"

str2 = "124"

strcmp(str1,str2)如果说str1比str2大就会返回大于0的数,一般是1;如果相等返回0,小于返回-1.

它是比较这两个字符串的ascll值来比较的,比方说3的ascll值就比4小,那么前面的都相同,那么就会返回-1。会一直比较到'\0'。这就出现一个问题,比方说23和231谁放在前面作为拼数的话比较大呢?肯定是23放在前面拼数的话比较大,但是23比231小一个字节,那么比较最后一个字符的时候,就会出现错误。所以这里就需要重新判断以下。(可能说的不是很清楚,看代码吧还是。)

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

int main()
{
    int n, i, j, k;
    int len_f;
    int len_l;
    int min;

    scanf("%d", &n);
    
    char input[n][10];
    char temp[10] = {0};

    memset(input, 0, sizeof input); // 初始化为0

    for (i = 0; i < n; i++){
        scanf("%s", &input[i]);
    }

    
    for (i = 0; i < n-1; i++){ // 这里就是冒泡排序,比较值的大小
        for (j = 0; j < n-1-i; j++){
            len_f = strlen(input[j]);
            len_l = strlen(input[j+1]);
            // 如果前面数值相等,但是某一个字符串长一点,那么判断就会有误(文章最后详解 1)
            if (input[j][0] == input[j+1][0] && len_f != len_l){
                if (len_f > len_l){
                    min = len_l;
                } else {
                    min = len_f;
                }
                for (k = 1; k < min; k++){
                    if (input[j][k] != input[j+1][k]){ //文章最后详解 2
                        break;
                    }
                }
                if (k == min){ // 前面的数都相等且长度短,那么就大,已经到某一个字符串的结尾了
                    // 如果时input[j] 135 input[j+1] 13 那么135 > 13
                    if (input[j][k] == '\0' && (input[j][0] > input[j+1][k])){ //详解3
                        continue;
                    }
                    if (input[j+1][k] == '\0' && (input[j+1][0] < input[j][k])){ // 详解4
                        continue; // 直接下次循环
                    }
                    else {
                        strcpy(temp, input[j]);
                        strcpy(input[j], input[j+1]);
                        strcpy(input[j+1], temp);
                        continue; // 直接下次循环
                    }
                    
                }
            } 
            if (strcmp(input[j], input[j+1]) >= 0){ // 判断j 是否大于j+1 
                continue;
            } else {
                // 如果j+1大于j,就交换位置
                strcpy(temp, input[j]);
                strcpy(input[j], input[j+1]);
                strcpy(input[j+1], temp);
            }
                
            
        }
    }
    
    for (i = 0; i < n; i++){
        printf("%s", input[i]);
    }
    printf("\n");

    return 0;
}

详解

首先来说我是用冒泡排序的方法来调整位置的,最大就在最前,最小就最后。(这里说的最大最小是做拼数的最大最小,不仅仅是数值上的大小。)

1、if (input[j][0] == input[j+1][0] && len_f != len_l) 这里是判断如果两个字符串的首字符相等,并且长度不等才执行if语句,因为如果长度相等那么strcmp就可以直接判断大小,就不需要进行额外的判断了。

2、第一点直接就判断的0的位置,那这里就直接从1开始判断,如果怕判断的过程当中,出现相同位置的字符不相等,那就直接退出,因为strcmp可以直接判断(不会判断到字符结尾,因为k<min)

3、进入到这里的if判断就证明两个字符串的数在结束之前都是相等的,比如13和135在13到结尾之前都相等,那么到这里if (input[j][k] == '\0' && (input[j][0] > input[j+1][k])),如果输入数据的时候13就在135前面并且13的1大于135的5时就直接跳过本次循环,什么意思?也就是说如果输入的是13 135那么拼数的时候13513肯定比13135要大啊,那么这里就要判断先结束的那个字符串它的首个数字是否比另一个字符串的k位置的数大,如果大于就不用换位,如果小就要换位。可以理解以下135 13和635 63.

4、这里如果你理解了3那么理解这里也就很简单了if (input[j+1][k] == '\0' && (input[j+1][0] < input[j][k])),这里是如果输入的是135 13此时13在后面了,那么就是后面这个字符串先结束,那么如果第一个字符串的k位置的数值比后面这个字符串的首字符大,是不是就不用换位了?所以这里就最直接continue了。

标签:13,洛谷,&&,拼数,len,C语言,135,字符串,input
From: https://blog.csdn.net/qq_74568860/article/details/140559583

相关文章

  • C语言_数组(1)
    一、一维数组1、数组的创建方式:数组是有限个相同类型数据元素的集合。type_t arr_name [const_n];//type_t是指数组的元素类型//const_n是一个常量表达式,用来指定数组的大小创建例子:注意:数组在创建时,[]里的必须是常量。但是如果编译器支持C99标准的话可以使用......
  • 洛谷 P5736 【深基7.例2】质数筛 纯代码
    题目描述输入 ......
  • 顺序表实现队列(c语言)
    队列概念篇图示代码篇1.队列的声明2.队列的创建3.队列的销毁4.队列扩容5.入列6.出列6.队首元素7.队列的元素个数完整代码运行结果建议你在看这篇文章先看一下顺序表知识。我在这里通过顺序表的写法实现先进先出的特征来实现队列。当然顺序表也可以实现栈,感......
  • 线性表——链表(c语言)
    链表概念篇示意图1.单向链表2.双向链表3.循环链表4.链表的元素插入5.链表的元素删除代码篇1.链表的定义2.链表的创建3.链表的销毁4.链表的元素插入5.链表的元素删除6.链表的元素查找7.链表下标对应的结点8.链表元素的修改9.链表的打印10.完整代码代码运行效果概......
  • 【c语言】日日练-通讯录
    通讯录题目解析(实现过程+要点)代码test.c(测试功能)contact.c(通讯录相关的实现)contact.h(通讯录相关的声明)题目实现一个通讯录,人的信息包括(姓名、年龄、性别、电话、地址)实现功能:1、存放100个人的信息2、增加联系人3、删除指定联系人4、查找联系人5、修改联系......
  • C语言运算符
    1.算术运算符+加法-减法*乘法/除法%取余 计算时,数据类型不一样的不能直接运算,需要转换成一样的才能运算,有两种转换方式。1.1隐式转换把一个取值范围小的,转换为取值范围大的,隐式转换是计算机自己就可以完成的,不会产生错误的。数据类型从大的到小的顺序为:double>float>lon......
  • C语言函数详解
    函数的概念不同于数学上的函数,在C语言中,函数(function)就是一个完成某项特定任务的一段代码,所以函数也叫子程序。函数的分类库函数为了提高写代码的效率,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据ANSI提供的标准就给出了一系列函数......
  • C语言基础(二)
    数据类型    数据类型介绍:            整型类型来描述整数,字符类型来描述字符,浮点型类型来描述小数;    字符型:char//character[signed]char//有符号的unsignedchar//⽆符号的    整型://短整型short[int][signed]s......
  • C语言基础(四)
    printf库函数基本用法:printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。#include<stdio.h>intmain(){printf("Hello,world");return0;}printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输......
  • C语言基础(三)
    算数操作符:+、-、*、\、%    C语言中为了方便运算,提供了一系列操作符(运算符),其中有一组操作符叫:算术操作符。分别是:+-*/%,这些操作符都是双目操作符。*运算符    用来完成乘法运算。/运算符    用来完成除法运算。    除号的两端如......