题意大致是:在一个序列里面,每个元素都是个数字序列,若该数字序列序号为j,则该序列就是1234.....j;输出这个总序列的第i个数字。
先把前八十个字符写出来:1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 12345678910 可以看出每个元素序列所具有的数字个数为该元素序列的位序加一。我的思路是这样的:先找出的i个数字所在的元素序列N,然后再找出第i个数字在第N个元素序列的第M个数字里,然后再求出是M里的那个字符个数字。代码如下:
#include#include __int64 f1(__int64 s)//求出前s个元素序列的所有数字位数和{ int i; __int64 a,k,n,sum=0; k=9;a=1;//a为首项 for(i=1;k<=s;i++,k*=10)//分段求出每一段的数字位数和 { sum=sum+k*a+k*(k-1)/2*i;//i为公差,k为项数 a=a+i*k+1;//更新首项 } n=s-k/9+1;//不够一段的个数 sum=sum+n*a+n*(n-1)/2*i;//总位数 return sum;}__int64 f2(__int64 s)//每个元素序列前n位数字的位数{ int i,count=0; __int64 k,sum=0,w=1; k=s; while(k)//确定该数字位数 { count++; k=k/10; w=w*10; } k=9; for(i=1;i m && f1(mid-1)>=m) high=mid-1; else if(k k && f2(mid-1)>=k) high=mid-1; else if(s =10) { count++; k=k/10; w=w*10; } while(m--) { k=low/w; low=low%w; w=w/10; } printf("%I64d\n",k); } return 0;}