1 solutions
-
0
题意为给出范围内有多少个数字含有“12”。 本题用python做很简单,就是遍历范围内的所有数字,每个都转换成数字字符串,然后使用in关键字判断子串“12”在不在里面。 主要说的是C++的做法。因为最大为四位数,所以我们只需要判断数字的第3,4位,2,3位,1,2位是否为“12”。3,4可以由对100取余得到;2,3位可以由除以10再取余100,或者取余1000再除以10得到;第1,2位可以由除以100得到。 分别对每个数字判断这三种情况是否存在一个等于12就好了。注意原本有多少位数并不不影响取余和除法操作。 C++核心参考代码:
bool check(int x)// 把判断封装成函数 { if (x % 100 == 12)// 34位是否为12 return 1; if (x / 100 == 12)// 12位是否为12 return 1; if (x / 10 % 100 == 12)// 23位是否为12 return 1; return 0;// 没有任何一个满足就返回false } inline void solve() { int ans = 0; for (int i = 1; i <= 2024; ++i) { if (check(i)) ++ans; } cout << ans << '\n'; }python参考代码:
ans = 0 for i in range(1, 2025): i = str(i) if "12" in i: ans += 1 print(ans)事实上C++也可以用类似python的方法,具体步骤就是,对于每一个数字:
- 先转化为字符串,方法就是先创建空字符串string k = "",再用取余10取出每一位数字,然后将这个数字异或48得到对应的数字字符的ASCII码,然后拼接到,注意我们是从尾到头取数字,要保持原来的顺序,我们就得每次都把字符拼接到字符串的头部而不是尾部,也就是说k = ch + k,而不是k = k + ch。
- 用find函数查找子串“12”是否在里面。
可以通过这种方法熟悉C++字符和数字的转换和字符串操作。
下面也给出该方法的C++核心参考代码:
string to_str(int x) { string k = ""; while (x) { k = char((x % 10) ^ 48) + k; x /= 10; } return k } inline void solve() { int ans = 0; for (int i = 1; i <= 2024; ++i) { if (to_str(i).find("12") ^ string::npos) ++ans; } cout << ans << '\n'; }答案为140
Information
- ID
- 15241
- Time
- 60000ms
- Memory
- 256MiB
- Difficulty
- 2
- Tags
- # Submissions
- 116
- Accepted
- 26
- Uploaded By