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

输入一行连续的8位数字(比如20130225),拆分为“4位年、2位月、2位日”,输出时月份/日期是1位数的话要补前导0(比如月份是2输出02)。
核心是按固定长度拆分输入,并控制输出格式:
printf的%02d格式,自动给1位数补前导0(比如输入2会输出02)。原代码用字符数组读入字符串,再按索引取对应位置的字符输出,思路是对的,但有2个细节可以优化:
char a[9](8位数字+结束符)是足够的,但如果输入长度变化(题目保证是8位,所以没问题);scanf的宽度控制符直接拆分数字(比如%4d读4位年),避免字符数组的索引操作。#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;
输入T个字符串,要求把字符串变成“任意相邻字符都不同”的“优美串”,求最少插入字符后的字符串长度。
核心规律:每有一对相邻相同的字符,就需要插入1个不同字符(比如"aaa"中,a-a出现2次,需插入2个字符,最终长度3+2=5)。
步骤:
c;c(每对相同字符插入1个字符)。原代码的核心逻辑是对的,但要注意2个细节:
char ch[100001]);for(int i=0; i<n; i++)的循环条件正确,但要确保每次输入的字符串被正确读取。#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循环)。
输入两个正整数a和b,求它们的最小公倍数(LCM)。
最小公倍数的公式是:
其中GCD是最大公约数,用辗转相除法计算:
b != 0,则GCD(a,b) = GCD(b, a%b);b == 0时,a就是最大公约数。原代码的核心思路正确,但有2个关键错误:
while(a%b!=0),正确条件应该是while(b!=0)(否则当a%b==0时,循环直接终止,此时b就是GCD,但逻辑不够通用);a*b可能超过int范围,要用long long存储。#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;
}long long避免整数溢出。

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