#include<iostream>// chengdacaizi 注释 using namespace std; long long key[35000]={0};//在dev中可以这么定义,代表64bits int getDigit(int n)//计算位数的函数 { int digit=1; while(n/10) { n=n/10; digit++; } return digit; } void init()//把每个数的位置存到数组里! { key[0]=0; for(int i=1; i<35000; i++) key[i]=key[i-1]+getDigit(i); } int main()//主函数 { int t; long long sum,n,i; init(); scanf("%d",&t); while(t--) { cin>>n;//输入位置n; i=1,sum=0; while(n>=sum+key[i])//计算在小于n 的情况下,前i-1段循环的位置总和; { sum=sum+key[i]; i++; } if(n==sum) printf("%d ",(i-1)%10);//如果 n 正好等于前 i-1 段的位置总和 那么最后一个 else //段的最后一个数就是所要求的那个数字 { n=n-sum; for(i=1; key[i]<=n; i++); //否则n将大于sum;可以想象是减去sum后多出来 n=n-key[i-1]; //一段;再用类似的方法,把前i段剪掉,保证 n 一定要 if(n!=0) //大于最后一段的位置; 剪下后剩下 最后的一小段; { //而n 所在的当前一段是1234...i; int num=i; //现在n 的长度从左向右 长度小于i or num n=getDigit(num)-n;//理解成从左到右的长度方向 for(i=1; i<=n; i++) num=num/10; printf("%d ",num%10); } else printf("%d ",(i-1)%10); } } system("pause"); return 0; }
关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。
技术网站地址: vmfor.com