正文

PKU1019解题报告2008-09-06 11:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bclz/38122.html

分享到:

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;
}

阅读(3053) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册