第一题 (p1.cpp, 50 分): 幸运数字
如果一个正整数的十进制表示中,每种数字都恰好出现了偶数次,Dr. X 就认为它是幸运数字。例如:
11 是幸运数字,数字 1 出现了 2 次 (偶数次)。 131131 是幸运数字,数字 1 出现了 4 次,数字 3 出现了 2 次,都是偶数次。 23333 不是幸运数字,因为数字 2 出现了 1 次 (奇数次)。 123 不是幸运数字,因为数字 1、2、3 各出现了 1 次 (奇数次)。
给定两个正整数 a 和 b,请你计算 a, a+1, a+2,...., b 中幸运数字的数量。
输入格式
输入两个空格分隔的正整数 a 和 b。
输出格式
输出一个整数,表示 a, a+1, a+2, ......, b 中幸运数字的数量。
样例输入 1
1 100样例输出 1
9
在 1 和 100 之间,幸运数字有 11, 22, 33, 44, 55, 66, 77, 88, 99。
样例输入 2
1 10000样例输出 2
261数据范围: 1<= a<=b<=一百万算法思路分析
我们可以采用直接遍历的方法:
- 遍历区间:从
a 循环遍历到a b 。b - 判断幸运数:对于每一个数字
i ,检查它是否是“幸运数字”。i - 提取
i 的每一位数字。i - 统计每个数字(0-9)出现的次数。
- 检查所有出现过的数字的计数是否都是偶数。
- 计数:如果是幸运数字,计数器加 1。
- 输出:最后输出计数器的值。
#include<iostream>#include<vector>using namespace std;// 判断一个数是否是幸运数字boolisLucky(int n){int count[10] = {0}; // 用来统计0-9每个数字出现的次数while (n > 0) {int digit = n % 10; // 取最后一位count[digit]++; // 对应数字计数加1n /= 10; // 去掉最后一位}// 检查所有出现的数字次数是否都是偶数for (int i = 0; i < 10; i++) {if (count[i] % 2 != 0) {return false; // 只要有一个数字出现次数是奇数,就不是幸运数字}}return true;}intmain(){int a, b;cin >> a >> b;int luckyCount = 0;// 遍历区间 [a, b]for (int i = a; i <= b; i++) {if (isLucky(i)) {luckyCount++;}}cout << luckyCount << endl;return 0;}
//位运算法#include<iostream>using namespace std;// 检查函数:使用位运算boolisLucky(int n){int mask = 0;while (n > 0) {int d = n % 10;// 将第 d 位翻转。例如 d=1,就是异或 0000000010mask ^= (1 << d);n /= 10;}// 如果 mask 为 0,说明所有位都翻转了偶数次,回到了 0return mask == 0;}intmain(){int a, b;cin >> a >> bint ans = 0;for (int i = a; i <= b; ++i) {if (isLucky(i)) {ans++;}}cout << ans << endl;return 0;}

........o...***.....*****....*...*....*.o.*....*...*....*****.....***............
上图中, 围成的区域代表圆形空地。包裹 o 如果落在边界围成的区域内部,就是一次正确投送。Dr. X 想请你统计正确投送的包裹数量。包裹要么在圆内,要么在圆外,保证不会在圆形的边界上。
输入格式
输入第一行包含两个空格分隔的整数 n 和 m,表示地图的行数和列数。接下来 n 行,每行 m 个字符,描述整张地图。字符只包含“”(边界)、“.”(空白)和“o”(包裹)。保证“”恰好围成一个闭合的环形边界,且地图中至少有一个“o”。
输入格式
一个整数,表示落在圆形区域内部的包裹数量



.)到达的外部点。最后,遍历整个地图,统计哪些是包裹(o)且未被标记为外部的点,即为落在圆内的包裹数量#include <bits/stdc++.h>using namespace std;int n, m;string g[55];bool vis[55][55];int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};voiddfs(int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m) return;if (vis[x][y] || g[x][y] == '*') return;vis[x][y] = true;for (int d = 0; d < 4; d++)dfs(x + dx[d], y + dy[d]);}intmain() {cin >> n >> m;for (int i = 0; i < n; i++)cin >> g[i];// 从四条边for (int i = 0; i < n; i++) {dfs(i, 0);dfs(i, m - 1);}for (int j = 0; j < m; j++) {dfs(0, j);dfs(n - 1, j);}// 统计圆内的 oint ans = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (g[i][j] == 'o' && !vis[i][j])ans++;}}cout << ans << endl;return 0;}
第三题 (p3.cpp, 75 分): 南京名片
Dr. X 要给南京展会设计巨幅广告,图案由两个大写字母 N、J 组成。给定一个正整数

输入格式
输入一个正整数
输出格式
输出
输入样例
5
输出

输入样例
9
输出

题解:纯模拟
#include<iostream>using namespace std;intmain(){int n;cin >> n;for(int i=0;i<n;i++){//N南for(int j=0;j < n;j++){if(j==0 || j== n-1 || i==j){cout << "*";}else{cout << " ";}}cout << " ";//J 京for(int j=0;j < n;j++){if(i == 0 || n/2 == j){cout << "*";}else if(i == n-1 && j <= n/2){cout << "*";}else{cout << " ";}}cout << endl;}return 0;}