1. 题目解析与解题思路
这道GESP二级真题的核心是考察嵌套循环和数位分离这两个基础但重要的编程概念。我们先来理解题目要求:给定一个正整数n,要求统计从1到n的所有整数中,数字"1"出现的总次数。
举个例子,如果n=12,那么我们需要统计1,2,3,...,12这些数字中"1"出现的次数:
- 1 → 1次
- 10 → 1次
- 11 → 2次
- 12 → 1次
总共是1+1+2+1=5次。
1.1 暴力解法思路
最直观的解法就是暴力枚举:
- 外层循环遍历1到n的每个数字
- 内层循环对每个数字进行数位分离
- 统计每个数字中"1"的出现次数
- 累加所有数字的统计结果
这种解法虽然简单直接,但对于大数n来说效率不高。不过作为入门题目,它很好地考察了循环和数位处理的基本功。
1.2 数位分离的实现方法
数位分离是本题的关键技术点,常见的有两种实现方式:
- 取模法:
cpp复制while(num > 0) {
int digit = num % 10; // 获取最后一位
num /= 10; // 去掉最后一位
// 处理digit...
}
- 字符串转换法:
cpp复制string s = to_string(num);
for(char c : s) {
if(c == '1') count++;
}
对于初学者来说,取模法更值得掌握,因为它不依赖字符串操作,是更基础的编程技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整代码实现与解析
下面给出完整的C++实现代码,并逐段解析:
cpp复制#include <iostream>
using namespace std;
int countOnes(int n) {
int total = 0;
for(int i = 1; i <= n; i++) {
int num = i;
while(num > 0) {
if(num % 10 == 1) {
total++;
}
num /= 10;
}
