首页 > 代码库 > POJ 1019 Number Sequence 题解
POJ 1019 Number Sequence 题解
这又是一道看似简单,实际挺困难的题目。
本来想做道基础题消遣一下的,没想到反被消遣了-_-|||。
看个人的基础吧,对于数学好的会简单点,但是由于情况太多,需要都考虑全,故此难度应该在4星以上了。
我这里使用的方法就是直接打表,然后直接模拟,利用打表去掉一大段数据,剩下数据量十分小了,故此可以直接模拟。
打表是为了计算前面的周期数,把周期数直接去掉。
主要难点是后面10位数以上的数有2位, 3位,4位等情况要考虑。- 下面使用getNewNums一个函数解决了,想通了,就几行代码,还不用难理解的数学计算,呵呵。
然后是模拟数数位,那么就考基本的编程功力了。
简洁到可以不使用任何数学库就0ms过的程序:
#include <stdio.h> const int MAX_SIZE = 65535; long long arr[MAX_SIZE]; inline int getNewNums(int i) { int n = i; for (int ten = 10; ten <= i; ten = (ten << 1) + (ten << 3)) { n += i - ten + 1; } return n; } void fillArr() { arr[0] = 0; arr[1] = 1; arr[2] = 3; for (int i = 3; i < MAX_SIZE; i++) { arr[i] = arr[i-1] + getNewNums(i); } } int getNum(int n) { int i = 1; for ( ; arr[i] < n && i < MAX_SIZE; i++); n -= (int)arr[i-1]; int num = 1; while (n) //直接模拟,因为前面已经截去一大段数据了,所以这里可以模拟 { char ch[33]; int j = 0, tmp = num; while (num) { ch[j++] = num % 10 + '0'; num /= 10; } for (j--; j >= 0; j--) { if (n == 1) return ch[j] - '0'; n--; } num = tmp+1; } return num; //false return.随便返回个数,上面已经会返回值了。 } int main() { fillArr(); int T, n; scanf("%d", &T); while (T--) { scanf("%d", &n); printf("%d\n", getNum(n)); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。