特别数的和
来源: 第十届蓝桥杯省赛C++B组,第十届蓝桥杯省赛JAVAB组
题目要求
题目描述:
输入格式:
共一行,包含一个整数 n 。
输出格式:
共一行,包含一个整数,表示满足条件的数的和。
数据范围:
1≤n≤10000
输入样例:
40
输出样例:
574
思路分析
直接暴力做即可,这里有一个常用的模板,求一个数的各位的数字,不熟悉的读者建议背一下:
while (x) { int t = x % 10; //取个位 x /= 10; //删个位 }
代码
#include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { int n; cin >> n; int res = 0; for (int i = 1; i <= n; i ++ ) { int x = i; while (x) { int t = x % 10; //取个位 x /= 10; //删个位 if (t == 2 || t == 0 || t == 1 || t == 9) { res += i; break; } } } cout << res << endl; return 0; }
错误票据
来源: 第四届蓝桥杯省赛C++A/B组,第四届蓝桥杯省赛JAVAA/B组
题目要求
题目描述:
输入格式:
输出格式:
数据范围:
1≤N≤100
输入样例:
2
5 6 8 11 9
10 12 9
输出样例:
7 9
思路分析
代码
#include <iostream> #include <sstream> #include <algorithm> #include <cstring> using namespace std; const int N = 100010; int cnt, n; int a[N]; string l; int main() { cin >> cnt; getchar(); //读掉换行符 while (cnt -- ) { getline(cin, l); stringstream ssin(l); while (ssin >> a[n]) n ++; } sort(a, a + n); int res1, res2; for (int i = 1; i < n; i ++ ) if (a[i] == a[i - 1]) res2 = a[i]; else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1; cout << res1 << ' ' << res2 << endl; return 0; }
回文日期
题目要求
题目描述:
输入格式:
输出格式:
输出共一行,包含一个整数,表示在 d a t e 1 和 d a t e 2 之间,有多少个日期是回文的。
输入样例:
20110101
20111231
输出样例:
1
思路分析
日期类题目,首先判断是否为闰年:如果一年是闰年,要么满足可以被400 整除,要么满足不能被 100 整除但可以被 4 整除。本题中,我们如果去枚举日期的话是十分麻烦的,所以我们换一个思路,我们去枚举回文串,本题的回文串其实本质上就是一个回文八位数,我们可以枚举前四位,即枚举年,我们从 1000 开始枚举,直到枚举到 9999 ,利用前四位去构造后四位的回文,代码如下:
for (int i = 1000; i < 10000; i ++ ) { int date = i, x = i; for (int j = 0; j < 4; j ++ ) { date = date * 10 + x % 10; x/= 10; } }
然后对于构造出来的回文八位数,我们去判断是否在两个给定日期之间,判断方法直接进行数值大小的比较即可,如果在两个给定日期之间,我们进而进行判断是否合法,我们取出 年月日:
int year = date / 10000; int month = date / 100 % 100; int day = date % 100;
代码
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool is_right(int date) { int year = date / 10000; int month = date / 100 % 100; int day = date % 100; if (month > 12 || month < 1) return false; if (month != 2 && day > mon[month]) return false; int leap = (!(year % 400) || (year % 100) && !(year % 4)); if (month == 2 && day > mon[month] + 1) return false; return true; } int main() { int day1, day2; cin >> day1 >> day2; int res = 0; for (int i = 1000; i < 10000; i ++ ) { int date = i, x = i; for (int j = 0; j < 4; j ++ ) { date = date * 10 + x % 10; x/= 10; } if (date <= day2 && date >= day1) if (is_right(date)) res ++; } cout << res << endl; return 0; }