2026江苏信息与未来真题

四季读书网 3 0
2026江苏信息与未来真题
江苏省“信息与未来”小学生编程思维展示活动
是由江苏省青少年科技中心主办的省级小学生编程竞赛,旨在通过上机编程任务培养小学生的计算思维、创新能力和科学素养,每年在江苏省多地同步举行

    第一题 (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<=一百万

    算法思路分析

    我们可以采用直接遍历的方法:

    1. 遍历区间:从 aa 循环遍历到 bb 。
    2. 判断幸运数:对于每一个数字 ii ,检查它是否是“幸运数字”。
      • 提取 ii 的每一位数字。
      • 统计每个数字(0-9)出现的次数。
      • 检查所有出现过的数字的计数是否都是偶数。
    3. 计数:如果是幸运数字,计数器加 1。
    4. 输出:最后输出计数器的值。 
    #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]++;     // 对应数字计数加1        n /= 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,就是异或 0000000010        mask ^= (1 << d);         n /= 10;    }    // 如果 mask 为 0,说明所有位都翻转了偶数次,回到了 0    return mask == 0;}intmain(){    int a, b;    cin >> a >> b    int ans = 0;    for (int i = a; i <= b; ++i) {            if (isLucky(i)) {                ans++;            }    }    cout << ans << endl;    return 0;}
    第二题 (p2.cpp, 75 分): 快递无人机
    2026江苏信息与未来真题 第1张
    Dr. X 制作了一台快递无人机,正在测试投送包裹。投送的目标区域是一个圆形空地,它的边界在地图上用星号“”标出。地图上的空白区域用半角点号“.”表示,每个包裹的落点用小写字母“o”标记。下图是一个例子:
    ........o...***.....*****....*...*....*.o.*....*...*....*****.....***............

    上图中, 围成的区域代表圆形空地。包裹 o 如果落在边界围成的区域内部,就是一次正确投送。Dr. X 想请你统计正确投送的包裹数量。包裹要么在圆内,要么在圆外,保证不会在圆形的边界上。

    输入格式

    输入第一行包含两个空格分隔的整数 n 和 m,表示地图的行数和列数。接下来 n 行,每行 m 个字符,描述整张地图。字符只包含“”(边界)、“.”(空白)和“o”(包裹)。保证“”恰好围成一个闭合的环形边界,且地图中至少有一个“o”。

    输入格式 

    一个整数,表示落在圆形区域内部的包裹数量

    2026江苏信息与未来真题 第2张
    2026江苏信息与未来真题 第3张
    2026江苏信息与未来真题 第4张
    解法:
    典型的深度优先搜索(DFS)的洪水填充算法。从地图的四条边界开始,标记所有可以通过空白区域(.)到达的外部点。最后,遍历整个地图,统计哪些是包裹(o)且未被标记为外部的点,即为落在圆内的包裹数量
    #include <bits/stdc++.h>using namespace std;int n, m;string g[55];bool vis[55][55];int dx[] = {001-1}, dy[] = {1-100};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);      }          // 统计圆内的 o        int 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 组成。给定一个正整数 nn ,表示字母的大小。你需要按照以下规则输出这两个字母,并且两个字母之间恰好用一个空格隔开

    2026江苏信息与未来真题 第5张

    输入格式

    输入一个正整数 nn 。

    输出格式

    输出 nn 行,每行包含两个由单个空格隔开的字母图案。

    输入样例 

    5

    输出

    2026江苏信息与未来真题 第6张

    输入样例

    9

    输出

    2026江苏信息与未来真题 第7张

    题解:纯模拟

    #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;}

    抱歉,评论功能暂时关闭!