51nod 1795 奥林匹克年
题目
奥林匹克竞赛从1989年开始举行,每一个奥林匹克年都会有一个缩写IAO’y, y表示那一年的最后几位数字。 组织者会取一个之前未被用过的缩写来表示该年份,而且要尽可能的短。
例如,前三个奥林匹克年是1989,1990和1991,他们对应的缩写是IAO’9, IAO’0 和IAO’1,而2015的缩写是IAO’15,因为IAO’5已经被1995用过了。
现在给出一个缩写,请判断这个是代表哪一年的。
输入
多组测试数据。
第一行有一个整数n (1≤n≤1000) ,表示要处理n组数据。
接下来n行,每一行有一个缩写。每一个缩写最多包含9位数字。
输出
对于每一个缩写,请输出对应的年份。
样例
输入 :
5
IAO’15
IAO’2015
IAO’1
IAO’9
IAO’0
输出:
2015
12015
1991
1989
1990
解题思路
通过计算我们可以得出:
用一位数当后缀的有10个年份
用二位数当后缀的有100个年份
用三位数当后缀的有1000个年份
…
以此类推
那我们就可以把这个年份的范围算出来,然后累加
1
0
s
10^{s}
10s (s为这个年份的位数)
由于后缀保证相同,所以第一个大于“范围”的就是我们要求的年份。
举个例子
例如IAO’2021,由于2021为四位数,所以它的范围必定在1989+10+100+1000 = 3099之外,因为3099内的年份都以一位、二位、三位的数字当后缀了。
然后我们累加10000,得到的第一个大于3099的数12021就是答案。
上代码
#include <bits/stdc++.h>
using namespace std;
int n;
char str[100];
int m[10], sum[10];
int main() {
cin >> n;
mr[0] = 1;
for (int i = 1; i <= 10; i++) {
m[i] = m[i - 1] * 10;
sum[i] = sum[i - 1] + m[i];
}
while (n--) {
cin >> str;
int len = strlen(str + 4);
int num = atoi(str + 4);
while (num < 1989 + sum[len - 1]) num += m[len];
cout << num << endl;
}
return 0;
}
请您点一下下面的大拇指😊