1. 题目解析与解题思路
这道题目要求我们判断一个三位数中是否有且仅有两个相同的数字。换句话说,我们需要检查输入的数字是否是"双胞胎数"(如112、121、211等),同时排除像111这样的全相同数字和123这样所有数字都不同的情况。
1.1 题目理解要点
首先我们需要明确几个关键点:
- 输入保证是一个三位正整数
- 需要判断的是数字的组成,而不是数值本身
- 只有恰好两个相同数字的情况才输出"Yes"
- 三个数字全相同或全不同都输出"No"
1.2 解题核心思路
解决这个问题的基本思路可以分为三个步骤:
- 分解数字:将三位数的每一位数字提取出来
- 比较数字:检查这些数字之间的相等关系
- 判断条件:统计相同数字的对数,当且仅当有一对时输出"Yes"
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
2.1 数字分解的实现
c复制int str[3] = {0};
int n = 0;
scanf("%d", &n);
for(int i = 0; i < 3; i++) {
str[i] = n % 10;
n /= 10;
}
这段代码完成了数字分解的工作:
- 定义一个长度为3的数组
str来存储各位数字 - 使用
n % 10获取最低位的数字 - 通过
n /= 10去掉已经处理的最低位 - 循环3次即可得到所有位上的数字
注意:这里数字的存储顺序是从个位到百位,即str[0]是个位,str[1]是十位,str[2]是百位。这种顺序不会影响后续的比较结果。
2.2 数字比较的实现
c复制int cnt = 0;
for(int i = 0; i < 3; i++) {
for(int o = i + 1; o < 3; o++) {
if(str[i] == str[o]) {
cnt++;
}
}
}
这段代码通过双重循环比较数字:
- 外层循环遍历每个数字
- 内层循环从当前数字的下一个开始比较
- 当发现相等时计数器
cnt加1
这种比较方式确保每对数字只比较一次,不会重复比较。
2.3 条件判断的实现
c复制if(cnt == 1)
