Online Compiler C

#include <stdio.h> int main() { int n, save_n; scanf("%d", &n); save_n = n; for (int digit = 0; digit <= 9; digit++) { n = save_n ; int count_digit = 0; while (n > 0) { int current_digit = n % 10; n /= 10; if (current_digit == digit) { count_digit++; } } if (count_digit > 1) { printf("%d", digit); } } }
这段代码的功能是:读取一个整数,然后找出其中出现次数超过1次的数字,并按数字0到9的顺序输出这些重复的数字。

代码的思路是:对于每个可能的数字(0到9),遍历整个整数的每一位,统计该数字出现的次数,如果次数大于1就输出。

- 注意变量 `n` 在每次内层循环开始前被重置为 `save_n`,但重置的位置在 `for` 循环内部,这会导致内层 `while` 循环结束后 `n` 变为0,然后下一次外层循环开始时才重置。这样第一次循环时 `n` 是正确的,但后续循环中 `n` 在进入 `while` 前已经被重置,所以逻辑上没问题,但代码风格可以改进。

- 当前代码没有处理数字0的情况。如果输入的数字本身包含0,比如1020,那么0出现了两次,应该输出0。但你的代码中,当 `digit` 为0时,`while (n > 0)` 循环会跳过所有位,因为 `n` 在第一次循环后变为0,导致0的计数始终为0。思考一下如何让循环也能处理数字0。