写数字
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
把由1开始的自然数依次写下来:123456789101112……,重新分组,按四个数字为一组:1234,5678,9101,1121,3141,5161,…0348…,问第n个数是几?
Output:
对于每组数据,输出第n个数(去除前导0)
Sample Output:
1234
解题思路:n最大取1w,说明拼接成的字符串长度至少为4w,简单计算一下可知只需将1~11000每一个数字拼接起来即可,然后取第n个四位数,有前导0要去掉,水过!
需要掌握的知识点(将整型数据转化成字符串OJ可用函数):int sprintf( char *buffer, const char *format, [ argument] … );其头文件是stdio.h;
参数列表:buffer:char型指针,指向将要写入的字符串的缓冲区。format:格式化字符串。[argument]...:可选参数,可以是任何类型的数据。
返回值:返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
sprintf 返回以format为格式argument为内容组成的结果被写入buffer 的字节数,结束字符' '不计入内。即,如果"Hello"被写入空间足够大的buffer后,函数sprintf 返回5。同时buffer的内容将被改变。
因为返回的是写入buf数组的字符个数,所以每次要叠加k,而buf+k刚好为每次写入数据的开始地址,最后还要加一个结束符。
注意:函数itoa()同样可以将整型数据转化成字符串,但它是非标准函数,OJ是不识别的,因此常用函数为int sprintf()。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=5e+5;
4 char buf[maxn];int n,m,r,k=0;
5 int main(){
6 for(int i=1;i<=11000;++i)
7 k+=sprintf(buf+k,"%d",i);
8 buf[k-1]='
';
9 while(~scanf("%d",&n)){
10 r=0;
11 for(int i=(m=4*(n-1));i<m+4;++i)r=r*10+buf[i]-'0';
12 printf("%d
",r);
13 }
14 return 0;
15 }