【例78.3】回文数(Noip1999) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N≤10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 输入描述 第1行,给定一个N(2<N≤10或N=16)表示进制; 第2行,一个N进制数M。 输出描述 最少几步。如果
```cpp #include <iostream> #include <string> #include <algorithm> // 将字符转换为对应的数值 int charToNum(char c) { if (c >= '0' && c <= '9') { return c - '0'; } return c - 'A' + 10; } // 将数值转换为对应的字符 char numToChar(int num) { if (num < 10) { return num + '0'; } return num - 10 + 'A'; } // 实现N进制加法 std::string add(std::string a, std::string b, int n) { std::string result; int carry = 0; int i = a.size() - 1, j = b.size() - 1; while (i >= 0 || j >= 0 || carry) { int sum = carry; if (i >= 0) { sum += charToNum(a[i]); i--; } if (j >= 0) { sum += charToNum(b[j]); j--; } result.push_back(numToChar(sum % n)); carry = sum / n; } std::reverse(result.begin(), result.end()); return result; } // 判断一个字符串是否是回文串 bool isPalindrome(std::string s) { int left = 0, right = s.size() - 1; while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; } // 反转字符串 std::string reverseStr(std::string s) { std::string reversed = s; std::reverse(reversed.begin(), reversed.end()); return reversed; } int main() { int n; std::string m; std::cin >> n >> m; int steps = 0; while (steps <= 30) { if (isPalindrome(m)) { std::cout << steps << std::endl; return 0; } std::string reversed = reverseStr(m); m = add(m, reversed, n); steps++; } std::cout << "Impossible" << std::endl; return 0; } ``` 代码说明: 1. `charToNum`函数:将字符转换为对应的数值,对于数字字符,直接转换为对应的整数;对于字母字符,转换为对应的十六进制数值。 2. `numToChar`函数:将数值转换为对应的字符,对于小于10的数值,转换为对应的数字字符;对于大于等于10的数值,转换为对应的十六进制字母字符。 3. `add`函数:实现N进制加法,从低位到高位逐位相加,并处理进位。 4. `isPalindrome`函数:判断一个字符串是否是回文串,通过双指针法比较字符串的首尾字符。 5. `reverseStr`函数:反转字符串。 6. `main`函数:读取输入的进制`n`和N进制数`m`,在30步内不断进行加法操作,直到得到回文数或超过30步。如果在30步内得到回文数,输出步数;否则输出`Impossible`。 [2026-02-02 17:44:17 | AI问答 | 811点数解答]
- [字节豆包] 【例78.3】回文数(Noip1999) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N≤10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 输入描述 第1行,给定一个N(2<N≤10或N=16)表示进制; 第2行,一个N进制数M。 输出描述 最少几步。如果(811点数解答 | 2026-02-02 17:44:17)8
- [字节豆包] 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78= 165 STEP2: 165+561= 726 STEP3: 726+627=1353 STEP4:1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 c++ using namespace std;要有 不要注释(491点数解答 | 2025-09-26 19:16:14)75
- [字节豆包] 【提高】Comfortable Cows 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 Farmer Nhoj 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。初始时,草地上是空的。 Farmer Nhoj 将会逐一地将 NN(1≤N≤105)头奶牛加入到草地上。第 ii 头奶牛将会占据方格 (xi,yi),不同于所有已经被其他奶牛占据的方格(0≤xi,yi≤1000)。 一头奶牛被称为是「舒适的」,如果它水平或竖直方向上与恰好三头其他奶牛相邻。然而,太舒适的奶牛往往产奶量落后,所以 Farmer Nhoj 想要额外加入一些奶牛直到没有奶牛(包括新加入的奶牛)是舒适的。注意加入的奶牛的 xx 和 yy 坐标并不一定需要在范围 0…1000内。 对于 1…N 中的每个 i,输出当初始时草地上有奶牛 1…i 时,Farmer Nhoj 为使得没有奶牛舒适,需要加入的奶牛的最小数量。(956点数解答 | 2026-02-02 17:26:13)7
- [字节豆包] 【NOIP2014 基础】螺旋矩阵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,...,n 2 ,便构成了一个螺旋矩阵。 下图是一个 n=4 时的螺旋矩阵。 ⎝ ⎜ ⎜ ⎜ ⎛ 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 ⎠ ⎟ ⎟ ⎟ ⎞ 现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。 输入描述 共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 输出描述 一个整数,表(289点数解答 | 2026-02-02 17:32:56)6
- [字节豆包] 例7.2】与圆相关的计算 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:入门 分数:100 OI排行榜得分:12(0.1*分数+2*难度) 出题人: 描述 给出圆的半径,求圆的直径、周长和面积。 如果圆的半径是 r,那么圆的直径、周长、面积分别是2×r、2×π×r、π×r×r,其中约定π=3.14159。 输入描述 输入包含一个实数r(0<r≤10,000),表示圆的半径。 输出描述 输出一行,包含三个数,分别表示圆的直径、周长、面积,数与数之间以一个空格分开,每个数保留 4 位小数。 用例输入 1 3.0 用例输出 1 6.0000 18.8495 28.2743 来源 http://bas.ssoier.cn:8086/problem_show.php?pid=3028 顺序结构c++(382点数解答 | 2026-02-02 17:41:00)6
- [字节豆包] 提高】卫星照片 USACO 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 农夫约翰总是想要一个农场的地图,所以他拍摄了一张N行M列的卫星照片。一部分的照片看起来像这样: .................. ..#####.......##.. ..#####......##... .................. #.......###.....#. #.....#####....... 他认为每个联通块都是一个谷仓或一头奶牛。联通块由若干个彼此水平或垂直相邻的#符号组成。以下的照片被认为是两个联通块: .... .#.. ..#. .... 农夫约翰认为一个联通块是谷仓,当且仅当它是一个完整的矩形,否则该联通块是一头奶牛。在第一张照片上面,有三个谷仓(大小分别为2x1,2x5和1x1)和两头奶牛。 计算他的卫星照片中谷仓和奶牛的数量。 输入描述 行1:两个空格分隔的整数:N和M(N,M<=80)。(850点数解答 | 2026-02-03 17:15:10)7
- [字节豆包] 题目描述 在甜甜圈王国中,每颗甜甜圈都有一个甜度值 S 来衡量其甜蜜程度。根据甜度的不同,甜甜圈被评定为不同的等级,具体规则如下: 如果 S 在 0 到 25 之间(包含 0 和 25 ),输出 "普通甜甜圈"; 如果 S 在 26 到 50 之间(包含 26 和 50 ),输出 "美味甜甜圈"; 如果 S 在 51 到 75 之间(包含 51 和 75 ),输出 "极品甜甜圈"; 如果 S 在 76 到 99 之间(包含 76 和 99 ),输出 "绝世甜甜圈"; 如果 S 等于 100 ,输出 "传说甜甜圈"。 请根据给定的甜度值 S,输出对应的甜甜圈等级名称。 输入格式 一行一个整数 S,表示甜甜圈的甜度值。(243点数解答 | 2025-12-06 18:35:50)58
- [字节豆包] 算法提高 夺宝奇兵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 512MB,其他语言 1024MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5->7->8->3->7的顺序,将得到最大值30 输入描述 第一行正整数N(100>=N>1),表示山的高度 接下来有N行非负整数,第i行有i个整数(1<=i<=N),表示山的第i层上从左到右每条路上的珠宝数目 输出描述 一个整数,表示从山底到山顶的所能得到的珠宝的最大数目. 用例输入 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 用例输出 1 30 来源 蓝桥杯练习系统C++(456点数解答 | 2026-02-03 17:12:35)7
- [字节豆包] 算法提高 夺宝奇兵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 512MB,其他语言 1024MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5->7->8->3->7的顺序,将得到最大值30 输入描述 第一行正整数N(100>=N>1),表示山的高度 接下来有N行非负整数,第i行有i个整数(1<=i<=N),表示山的第i层上从左到右每条路上的珠宝数目 输出描述 一个整数,表示从山底到山顶的所能得到的珠宝的最大数目. 用例输入 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 用例输出 1 30 来源 蓝桥杯练习系统C++(649点数解答 | 2026-02-03 17:13:24)7
- [字节豆包] [GESP202503 五级] 原根判断 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:未知 分数:100 OI排行榜得分:20(0.1*分数+2*难度) 出题人: 描述 小 A 知道,对于质数 p 而言,p 的原根 g 是满足以下条件的正整数: 1<g<p; g p−1 modp=1; 对于任意 1≤i<p−1 均有 g i modp =1。 其中 amodp 表示 a 除以 p 的余数。 小 A 现在有一个整数 a,请你帮他判断 a 是不是 p 的原根。 输入描述 第一行,一个正整数 T,表示测试数据组数。 每组测试数据包含一行,两个正整数 a,p。 输出描述 对于每组测试数据,输出一行,如果 a 是 p 的原根则输出 Yes,否则输出 No。 用例输入 1 3 3 998244353 5 998244353 7 998244353 用例输出 1 Yes Yes No 提示 【数据范围】 对于 40% 的测试点,保证 3≤p≤10 3 。 对于所有测试(668点数解答 | 2026-02-02 17:30:47)6
- [字节豆包] [GESP202503 五级] 原根判断 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:未知 分数:100 OI排行榜得分:20(0.1*分数+2*难度) 出题人: 描述 小 A 知道,对于质数 p 而言,p 的原根 g 是满足以下条件的正整数: 1<g<p; g p−1 modp=1; 对于任意 1≤i<p−1 均有 g i modp =1。 其中 amodp 表示 a 除以 p 的余数。 小 A 现在有一个整数 a,请你帮他判断 a 是不是 p 的原根。 输入描述 第一行,一个正整数 T,表示测试数据组数。 每组测试数据包含一行,两个正整数 a,p。 输出描述 对于每组测试数据,输出一行,如果 a 是 p 的原根则输出 Yes,否则输出 No。 用例输入 1 3 3 998244353 5 998244353 7 998244353 用例输出 1 Yes Yes No 提示 【数据范围】 对于 40% 的测试点,保证 3≤p≤10 3 。 对于所有测试(511点数解答 | 2026-02-03 17:11:00)7
- [字节豆包] 【NOIP2015 基础】扫雷游戏(mine) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 输入描述 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 输出描述 输出文件包含 n 行,每行 m(545点数解答 | 2026-02-02 17:34:02)9