PKU1019解题报告
题目大意:
一串数由1写道k.
1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011
初始时候k=1.写完一次后k增加1.重新从1写到k,以此循环.
求这串数的第n位
这串数的特征为:一个数比他的前一个数多了(int)log(10)+1位.其他完全相同
第一个while()循环求出k;即k+1写完时,位数超过n.写完k时,位数不足n
第二个while()循环求出i(i为1`k中的数字);要求第i+1个数写完时,位数超过n.第i个数时,位数不足n.从而求出i
不知道这种方法叫什么.应该是逐步求精的思想吧.
题目中使用函数log10()来求出一个数字的位数.
log10在math.h 中声明:
形式为_CRTIMP double __cdecl log10 (double);
如果没有将其参数定义为double类型,将会编译错误.
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
int main()
{
int t;
cin>>t;//第一行输入
for(;t>0;t--)
{
unsigned long int n;
cin>>n;
unsigned long int now=0,last=0;
double i=0;//math.h里边是这样定义的:_CRTIMP double __cdecl log10 (double);
//所以只能将i定义为double 型,否则编译错误
while(now<n)
{
last+=(int)log10(++i)+1;
now+=last;
}
now-=last;
n-=now;
now=0;
i=0;
while (now<n)//while循环求出已经写到了数字i.
{
now+=(int)log10(++i)+1;
}
now-=(int)log10(i)+1;
n-=now;
int j=(int)log10(i)+2;
j=j-n;//此时要求的为i从前往后的第n位数
for(int k=1;k<j;k++)
i=i/10;//从后往前求i的第j位
j=(int)i;//
j%=10;
cout<<j<<endl;
}
system("pause");
return EXIT_SUCCESS;
}
正文
PKU1019解题报告2008-09-06 11:39:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/bclz/38122.html
阅读(3053) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论