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

评论