poj 1019
懂了
题意是给一串 1 12 123 1234 12345 123456 。。。。这样的数字问第
i个数字是多少
Sample Input
2 8 3
Sample Output
2 2
1 #include<math.h> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 unsigned int a[31270],s[31270]; //a是到第i个数字的位数,s是第i组的位数 6 void reset()//打表 7 { 8 int i; 9 a[1]=1; 10 s[1]=1; 11 for(i=2;i<31270;i++) 12 { 13 a[i]=a[i-1]+(int)log10((double)i)+1; 14 s[i]=s[i-1]+a[i]; 15 } 16 /*for(i=1;i<=100;i++) 17 { 18 printf("%d ",a[i]); 19 } 20 printf("\n"); 21 for(i=1;i<=100;i++) 22 { 23 printf("%d ",s[i]); 24 }*/ 25 } 26 27 int main() 28 { 29 int T; 30 int n; 31 int i; 32 scanf("%d",&T); 33 reset(); 34 while(T--) 35 { 36 scanf("%d",&n); 37 i=1; 38 39 while(s[i]<n) i++; /* 找到 n 所在的组 */ 40 41 int pos=n-s[i-1]; /* n 在该组的下标 */ 42 int tmp=0; 43 for(i=1;tmp<pos;i++) /* length: n指向的数字的最后一位的下标 */ 44 { 45 tmp+=(int)log10((double)i)+1; 46 } 47 printf("%d %d\n",pos,tmp); 48 int k=tmp-pos; 49 printf("%d\n",(i-1)/(int)pow(10.0,k)%10) ;/*从右向左求,比如123456,k=2,则结果为4*/ /* 去掉所求位后面的数字然后取余 */ 50 /* i: n指向的数字 + 1 */ 51 52 } 53 return 0; 54 55 }