POJ 1019 Number Sequence
来源:互联网 发布:淘宝号被冻结解冻方法 编辑:程序博客网 时间:2024/05/18 12:40
这道题想到思路就简单 想不到就悲剧了 第一次想到的算法 果断超时 后面想到分成多组来算 每组不超过1亿位 还是超时 最后看了下别人的思想 如下:
题意: 求数列的第N位是什么 不是数 是位 例如 12345678910 第十位是1 不是10
这个序列是这样的
1
12
123
1234
12345
可以算出总共有多少排 每排的位数可以算数来
给个N 就可以算出第N位数是在第几排 然后从1开始计算 速度很快 具体的看看代码
#include<cstdio>#include<cstring>long long s[40000];long long T;void Init(){ s[1] = 1; long long k,j,sum = s[1]; T = 2; for(j = 2; sum <= 2147483647 ; j++) { if(j >= 10000) k = 5; else if(j >=1000) k = 4; else if(j >= 100) k = 3; else if(j >= 10) k = 2; else k = 1; s[T] = s[T-1] + k; sum += s[T]; T++; }}int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // LOCAL Init();///T = 32169 long long K; scanf("%lld",&K); while(K--) { long long N,n = 0,i,j,result; scanf("%lld",&N); long long sum = 0; for(i = 1; sum < N ;i++) sum += s[i]; i--;//计算出了在第几排 if(i > 1){sum -= s[i]; N -= sum;}//第i排第N位 for(j = 1; j <= i && n < N ; j++) { if(j >= 10000) n += 5; else if(j >=1000) n += 4; else if(j >= 100) n += 3; else if(j >= 10) n += 2; else n += 1; } long long k = 1; for(long long p = 0; p < n - N ; p++) k *= 10; result = --j / k % 10; printf("%lld\n",result); } return 0;}
0 0
- POJ 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- POJ-1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- 数据结构算法3_2
- 大学毕业后五年决定你的命运
- c/c++编译中遇到的问题
- VC中ComboBox下拉列表不显示数据或只显示一行问题
- 黑马程序员—多线程
- POJ 1019 Number Sequence
- C和C++实现Stack
- 关于学习Hadoop中未总结的资料
- 《javascript语言精粹》闭包一个糟糕的例子解惑
- 生活中的小办法恢复你误删的文件
- 菜鸟Android学习之路17-进度条的显示
- 怎么在linux中解压缩tar.xz格式文件
- 编写高效的android代码
- Android第12天--画廊