ACM_写数字

写数字

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

把由1开始的自然数依次写下来:123456789101112……,重新分组,按四个数字为一组:1234,5678,9101,1121,3141,5161,…0348…,问第n个数是几?

Input:

输入包含多组测试数据,每组数据包含一个整数n(1<=n<=10000);

Output:

对于每组数据,输出第n个数(去除前导0)

Sample Input:

1

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 }
原文地址:https://www.cnblogs.com/acgoto/p/9203097.html