问题描述:
小U数数,问题描述,小U正在数偶数,从0,2,4,6,8,10,12,…开始,依次将这些数连在一起,形成一,个无穷长的字符串,例如:"0246810121416..."。小U想知道这个字符串中的第n,个字符是什么。
解题思路:
顺序生成偶数,并将这些偶数依次转换为字符串,然后逐个字符地检查,直到找到目标位置(第n个字符)的字符。
解题过程:
初始化变量
num:用于记录当前正在处理的偶数,初始化为0。
count:用于记录当前已经数到的字符总数,初始化为0。
循环:
使用一个无限循环(while (true))来不断生成偶数并检查它们的字符。
生成偶数并转换为字符串:
在每次循环中,将当前的偶数num转换为字符串numStr。
遍历字符串:
遍历字符串numStr中的每个字符c。
每次遍历到一个字符时,将count增加1。
检查count是否等于n,如果等于,则找到了目标字符,将其转换为数字(通过c - '0')并返回。(这里利用了字符在 ASCII 码表中的规律,数字字符与它所表示的数字之间的差值是固定的,通过减去字符'0'的 ASCII 码值,就可以得到该字符所表示的实际数字。)
更新偶数:
如果当前字符串的字符遍历完毕后还没有找到目标字符,则将num增加2以生成下一个偶数,继续下一次循环。
返回结果:
一旦找到目标字符,返回其对应的数字值。
理论上,由于这是一个无限循环,只要n是合理的(即大于0),总会找到对应的字符。
通过这样不断地生成偶数、转换为字符串并逐个字符计数的过程,最终能够找到并返回无穷长字符串中的第个字符所对应的数字。
至此思路已经完成。
代码
#include <iostream>
using namespace std;
int solution(int n) {
// 用于记录当前已经处理到的偶数
int num = 0;
// 用于记录当前已经数到的字符位置
int count = 0;
while (true) {
// 将当前偶数转换为字符串
string numStr = to_string(num);
for (char c : numStr) {
count++;
if (count == n) {
// 如果数到了第n个字符,返回该字符对应的数字
return c - '0';
}
}
num += 2;
}
return 0;
}
int main() {
cout << (solution(6) == 1) << endl;
cout << (solution(10) == 1) << endl;
cout << (solution(15) == 8) << endl;
return 0;
}