题目链接:
http://codeforces.com/contest/664/problem/C
题解:
这题最关键的规律在于一位的有1989-1998(9-8),两位的有1999-2098(99-98),三位的有2099-3098(099-098),四位的有3099-13098(3099-3098)
所以关键字长度一样的会连续出现,1989+0代表一位的开始,1989+10代表两位的开始,1989+10+100代表三位的开始,
现在给你一个长度为len的标志,就可以找出该数位的起始位置1989+10+100+...+10^(len-1),终止位置为1989+10+100+...+10^len-1,这个数位里面前len位固定的数是唯一的,完全可以马上找到。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char str[22]; int ten[22]; void pre() { ten[0] = 1; for (int i = 1; i < 10; i++) ten[i] = ten[i - 1] * 10; //for (int i = 0; i < 10; i++) printf("ten:%d ", ten[i]); } int main() { pre(); int tc; scanf("%d", &tc); while (tc--) { scanf("%s", str); int len = strlen(str) - 4; int x = 0; for (int i = 4; i < len + 4; i++) x = x * 10 + str[i] - '0'; int tmp = 1989; for (int i = 1; i < len; i++) { tmp += ten[i]; } if (x < tmp%ten[len]) tmp += ten[len]; printf("%d ", tmp/ten[len]*ten[len]+x); } return 0; }