首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >3道编程基础必刷题:日期拆分、字符串美化、最小公倍数(附详细题解)

3道编程基础必刷题:日期拆分、字符串美化、最小公倍数(附详细题解)

作者头像
用户11944663
发布2025-12-22 11:04:14
发布2025-12-22 11:04:14
1750
举报

3道编程基础必刷题:日期拆分、字符串美化、最小公倍数(附详细题解)

编程入门阶段,格式处理、字符串遍历、数学公式是高频考点,这3道题正好覆盖了这些核心能力。今天拆解这3道题的思路、坑点和正确题解,帮你把基础打牢!

一、题1:出生日期拆分(格式处理+补0输出)

在这里插入图片描述
在这里插入图片描述
题目简化

输入一行连续的8位数字(比如20130225),拆分为“4位年、2位月、2位日”,输出时月份/日期是1位数的话要补前导0(比如月份是2输出02)。

思路分析

核心是按固定长度拆分输入,并控制输出格式:

  1. 输入是8位数字,可按“年(4位)+月(2位)+日(2位)”的固定长度拆分;
  2. 输出时用printf%02d格式,自动给1位数补前导0(比如输入2会输出02)。
原代码的思路与坑点

原代码用字符数组读入字符串,再按索引取对应位置的字符输出,思路是对的,但有2个细节可以优化:

  • 字符数组大小:原代码定义char a[9](8位数字+结束符)是足够的,但如果输入长度变化(题目保证是8位,所以没问题);
  • 更简洁的方式:用scanf宽度控制符直接拆分数字(比如%4d读4位年),避免字符数组的索引操作。
正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
int main() {
    int year, month, day;
    // 用宽度控制符直接拆分8位数字为年(4位)、月(2位)、日(2位)
    scanf("%4d%2d%2d", &year, &month, &day);
    // 输出时用%02d补前导0
    printf("year=%d\n", year);
    printf("month=%02d\n", month);
    printf("date=%02d\n", day);
    return 0;
}
考点总结
  • 格式输入:scanf的宽度控制符(%md)可以按指定长度读取数字;
  • 格式输出:printf%0nd表示输出n位,不足则补前导0;
  • 固定长度拆分:适用于身份证号、日期等有固定格式的字符串处理。

二、题2:字符串美化(相邻字符去重,最少插入长度)

在这里插入图片描述
在这里插入图片描述
题目简化

输入T个字符串,要求把字符串变成“任意相邻字符都不同”的“优美串”,求最少插入字符后的字符串长度。

思路分析

核心规律:每有一对相邻相同的字符,就需要插入1个不同字符(比如"aaa"中,a-a出现2次,需插入2个字符,最终长度3+2=5)。

步骤:

  1. 遍历字符串,统计“相邻字符相同”的次数c
  2. 最终长度 = 原字符串长度 + c(每对相同字符插入1个字符)。
原代码的思路与坑点

原代码的核心逻辑是对的,但要注意2个细节:

  • 字符数组大小:题目中字符串长度最大是1e5,所以数组要定义足够大(比如char ch[100001]);
  • 多组输入的循环:原代码中for(int i=0; i<n; i++)的循环条件正确,但要确保每次输入的字符串被正确读取。
正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
int main() {
    int T;
    scanf("%d", &T);
    while (T--) { // 多组输入,T次循环
        char s[100001]; // 足够大的数组存字符串
        scanf("%s", s);
        int len = strlen(s);
        int insert_cnt = 0;
        // 遍历字符串,统计相邻相同的次数
        for (int i = 1; i < len; i++) {
            if (s[i] == s[i-1]) {
                insert_cnt++;
            }
        }
        // 最终长度 = 原长度 + 插入次数
        printf("%d\n", len + insert_cnt);
    }
    return 0;
}
考点总结
  • 字符串遍历:通过strlen获取长度,循环遍历每个字符;
  • 计数逻辑:统计相邻元素的特征(相同/不同)是字符串题的常见思路;
  • 多组输入:用while(T--)处理更简洁(替代for循环)。

三、题3:最小公倍数(数学公式+辗转相除法)

在这里插入图片描述
在这里插入图片描述
题目简化

输入两个正整数ab,求它们的最小公倍数(LCM)。

思路分析

最小公倍数的公式是:

LCM(a,b)=a×bGCD(a,b)\text{LCM}(a,b) = \frac{a \times b}{\text{GCD}(a,b)}

其中GCD是最大公约数,用辗转相除法计算:

  1. b != 0,则GCD(a,b) = GCD(b, a%b)
  2. b == 0时,a就是最大公约数。
原代码的坑点

原代码的核心思路正确,但有2个关键错误:

  1. 辗转相除法的循环条件:原代码写while(a%b!=0),正确条件应该是while(b!=0)(否则当a%b==0时,循环直接终止,此时b就是GCD,但逻辑不够通用);
  2. 变量类型溢出:a*b可能超过int范围,要用long long存储。
正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
// 辗转相除法求最大公约数
long long gcd(long long a, long long b) {
    while (b != 0) {
        long long temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}

int main() {
    long long a, b;
    scanf("%lld %lld", &a, &b);
    // 最小公倍数 = 两数乘积 / 最大公约数
    long long lcm = a * b / gcd(a, b);
    printf("%lld\n", lcm);
    return 0;
}
考点总结
  • 数学公式:最小公倍数依赖最大公约数,记住公式避免重复造轮子;
  • 辗转相除法:求GCD的高效算法,时间复杂度O(log min(a,b));
  • 数据类型:涉及大数乘法时,用long long避免整数溢出。
在这里插入图片描述
在这里插入图片描述

写在最后:基础题的“稳”与“准”

这3道题都是入门阶段的“基础必过关”题——看似简单,但格式处理、循环逻辑、数学公式这些细节,直接决定了代码是否能一次AC。练这类题的关键是:先理清规律,再写代码,最后检查细节(格式、溢出、边界)

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3道编程基础必刷题:日期拆分、字符串美化、最小公倍数(附详细题解)
    • 一、题1:出生日期拆分(格式处理+补0输出)
      • 题目简化
      • 思路分析
      • 原代码的思路与坑点
      • 正确题解(C语言)
      • 考点总结
    • 二、题2:字符串美化(相邻字符去重,最少插入长度)
      • 题目简化
      • 思路分析
      • 原代码的思路与坑点
      • 正确题解(C语言)
      • 考点总结
    • 三、题3:最小公倍数(数学公式+辗转相除法)
      • 题目简化
      • 思路分析
      • 原代码的坑点
      • 正确题解(C语言)
      • 考点总结
    • 写在最后:基础题的“稳”与“准”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档