唉,被这道题虐惨了,从昨天晚上就开始做了,一直到现在才找到了一篇简短看得懂的题解,快把我的信心打掉完了,泪奔啊~~~~ 我咋没有想出来这么好的方法呢,我竟然把int的范围给记错了,题上给的值就是int的最大范围,所以我们应该开long long int的
分析:
这道题求得是第n位上的数,昨天晚上我竟然敲的是第n个数,我没理解好,输出永远是一个一位的数字。。。看的题解是先求出所求位是在哪一个序列中(序列的意思是1-n,如第3个序列是1,2,3,第四个序列是1,2,3,4)然后找到该序列上所求位的数字就行了,求得时候把每一个数都存到数组里面
贴代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
long long int a[10];
int main()
{
long long int T,i,j,sum,m,n,pre,s;
cin >> T;
// scanf("%lld",&T);
while(T--)
{
s = 0;
m = 0;
pre = 0;
//scanf("%d",&n);
cin >> n;
for(i=1; ; i++)
{
j=i;
sum = 0;//sum用来存储j是多少位的数
while(j!=0)
{
j=j/10;
sum++;
}
m += sum;//m用来存从1-j序列的位数
s += m;//s用来存储s1,s2,…sj的位数
if(s >= n)
break;
pre = s;
}
n -= pre;//这时候的n就是某从一开始的序列的第n位
//cout << n << endl;
s = 0;
for(i=1; ; i++)
{
j=i;
sum = 0;//sum用来存储j的位数
while(j!=0)
{
a[sum++] = j%10;//该数组用来存储j每一位上的数字 ,注意是反着存的,比如123,存到数组里是3 2 1
j/=10;
}
s += sum;//s表示当前一共有多少位
if(s >= n)
break;
}
cout << a[s-n] << endl;//准确的输出该位上的数字其实是由sum-【n-(s-sum)】变形所得
//printf("%lld\n",a[s-n]);
}
return 0;
}