问题描述:一个有趣常见的问题,将从1开始的数字首尾相接全部连在一起,那么,第n个字符是那个0-9的数字字符?
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int ans = n; //ans是最后的结果
int maxplace = 4; //最大位数
int charsum = 0; //当前位数的最大字符和
int lastplace_charsum = 0; //小一位数的最大字符和
int thisplace_charsum = 9; //仅是当前位数的字符和
int thisplace_minnum = 1; //仅是当前位数的最小数字
for(int i=1;i<=maxplace;i++) //i为当前位数
{
lastplace_charsum = charsum;
charsum+=i*thisplace_charsum;
if(n<=charsum) //说明n属于i位数字
{
ans-=lastplace_charsum; //ans是当前位数的字符差
int location = ans/i; //location是与当前位数最小数字的差
int remainder = ans%i; //获取余数
ans = location+thisplace_minnum-1; //ans是当前字符所属数字或前一个数字
if(remainder == 0) printf("%d\n",ans%10); //如果余数为0,答案为数字的最后一位
else
{
ans++; //如果余数不为0,答案处在下一个数字
int digitchar;//抽取出答案数字中的正确字符
for(int j=0;j<=i-remainder;j++)
{
digitchar = ans%10;
ans/=10;
}
printf("%d\n",digitchar);
}
break;
}
thisplace_charsum*=10;
thisplace_minnum*=10;
}
return 0;
}