快速判断一个数能否被1、2、3、4、5、6、7、8、9、10、11、12、13、17、19、23等整除的规律总结

本文总结了快速判断一个数能否被1至13、17、19、23等特定数字整除的方法。例如,末位是0、2、4、6或8的数能被2整除;数字和能被3整除的数则能被3整除。对于7、13、17、19等数的整除判断,提供了特殊的计算法则。

 

快速判断一个数能否被1、2、3、4、5、6、7、8、9、10、11、12、13、17、19、23等整除的规律总结

(1) 1与0的特性: 
1是任何整数的约数,即对于任何整数a,总有1|a. 
0是任何非零整数的倍数,a≠0,a为整数,则a|0. 
(2) 
若一个整数的末位是0、2、4、6或8,则这个数能被2整除。 
(3) 
若一个整数的数字和能被3整除,则这个整数能被3整除。 
(4) 若一个整数的末尾两位数能被4整除,则这个数能被4整除。 
(5) 若一个整数的末位是0或5,则这个数能被5整除。 
(6) 若一个整数能被2和3整除,则这个数能被6整除。 
(7) 若一个整数的个位数字截去,再从余下的数中,减去个位数的2倍,如果差是7的倍数,则原数能被7整除。如果差太大或心算不易看出是否7的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。例如,判断133是否7的倍数的过程如下:13-3×2=7,所以133是7的倍数;又例如判断6139是否7的倍数的过程如下:613-9×2=595 , 59-5×2=49,所以6139是7的倍数,余类推。 
(8)若一个整数的未尾三位数能被8整除,则这个数能被8整除。 
(9)若一个整数的数字和能被9整除,则这个整数能被9整除。 
(10)若一个整数的末位是0,则这个数能被10整除。 
(11)若一个整数的奇位数字之和与偶位数字之和的差能被11整除,则这个数能被11整除。11的倍数检验法也可用上述检查7的「割尾法」处理!过程唯一不同的是:倍数不是2而是1! 
(12)若一个整数能被3和4整除,则这个数能被12整除。 
(13)若一个整数的个位数字截去,再从余下的数中,加上个位数的4倍,如果差是13的倍数,则原数能被13整除。如果差太大或心算不易看出是否13的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。 
(14)若一个整数的个位数字截去,再从余下的数中,减去个位数的5倍,如果差是17的倍数,则原数能被17整除。如果差太大或心算不易看出是否17的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。 
(15)若一个整数的个位数字截去,再从余下的数中,加上个位数的2倍,如果差是19的倍数,则原数能被19整除。如果差太大或心算不易看出是否19的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。 
(16)若一个整数的末三位与3倍的前面的隔出数的差能被17整除,则这个数能被17整除。 
(17)若一个整数的末三位与7倍的前面的隔出数的差能被19整除,则这个数能被19整除。 
(18)若一个整数的末四位与前面5倍的隔出数的差能被23(或29)整除,则这个数能被23整除


### 题目重述 **题目描述:** 15码问题是在一个4×4的方格棋盘上,将1,2,3,...,14,15以任意顺序置入棋盘的各个方格中,空出一格,通过有限次移动,把一个给定的初始状态变成目标状态。移动规则是:每次只能在空格周围的四个字中任选一个移入空格。可以证明的是,一共16!的初始状态中,有一半是不可能移成目标状态的。 **输入描述:** 第一行为一个N,表示有N组据,随后是N组4×4的棋盘初始状态描述。 **输出描述:** 若在50步内不能完成,输出"This puzzle is not solvable",否则输出步如样例所示。其中R,L,U和D分别代表左,右,上和下。 **样例输入:** ``` 2 2 3 4 0 1 5 7 8 9 6 10 12 13 14 11 15 13 1 2 4 5 0 3 7 9 6 10 12 15 8 11 14 ``` **样例输出:** ``` LLLDRDRDR This puzzle is not solvable. ``` ### 给出答案(答案为带注释的代码块) ```cpp #include <iostream> #include <vector> #include <queue> #include <unordered_map> #include <cstring> using namespace std; struct State { int board[4][4]; // 棋盘状态 int zeroX, zeroY; // 空格的位置 string path; // 移动路径 int steps; // 当前步 // 用于比较两个状态是否相同 bool operator==(const State& other) const { for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) if (board[i][j] != other.board[i][j]) return false; return true; } }; // 用于哈希表中的哈希函 struct StateHash { size_t operator()(const State& state) const { size_t hash = 0; for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) hash = hash * 16 + state.board[i][j]; return hash; } }; // 将二维组转为一维组 vector<int> toVector(const State& state) { vector<int> vec(16); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { vec[i * 4 + j] = state.board[i][j]; } } return vec; } // 判断初始状态是否可解 bool isSolvable(const vector<int>& initial) { int inversions = 0; int emptyRow = 0; for (int i = 0; i < 16; ++i) { if (initial[i] == 0) { emptyRow = 4 - i / 4; } else { for (int j = 0; j < i; ++j) { if (initial[j] > initial[i] && initial[j] != 0) { ++inversions; } } } } return (inversions + emptyRow) % 2 == 0; } // 广度优先搜索求解最短路径 bool bfs(State start, State goal) { queue<State> q; unordered_map<State, bool, StateHash> visited; q.push(start); visited[start] = true; while (!q.empty()) { State current = q.front(); q.pop(); if (current.steps > 50) { return false; } if (current == goal) { cout << current.path << endl; return true; } int dx[] = {0, 0, -1, 1}; // 四个方向的偏移量 int dy[] = {-1, 1, 0, 0}; char move[] = {&#39;L&#39;, &#39;R&#39;, &#39;U&#39;, &#39;D&#39;}; for (int i = 0; i < 4; ++i) { int newX = current.zeroX + dx[i]; int newY = current.zeroY + dy[i]; if (newX >= 0 && newX < 4 && newY >= 0 && newY < 4) { State next = current; swap(next.board[current.zeroX][current.zeroY], next.board[newX][newY]); next.zeroX = newX; next.zeroY = newY; next.path += move[i]; next.steps++; if (!visited[next]) { visited[next] = true; q.push(next); } } } } return false; } int main() { int N; cin >> N; while (N--) { State start, goal; int index = 0; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { cin >> start.board[i][j]; if (start.board[i][j] == 0) { start.zeroX = i; start.zeroY = j; } } } vector<int> initial = toVector(start); if (!isSolvable(initial)) { cout << "This puzzle is not solvable." << endl; continue; } index = 0; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { goal.board[i][j] = index++; } } goal.board[3][3] = 0; goal.zeroX = 3; goal.zeroY = 3; goal.path = ""; goal.steps = 0; if (!bfs(start, goal)) { cout << "This puzzle is not solvable." << endl; } } return 0; } ``` ### 代码解析 1. **State结构体**:用于表示棋盘的状态,包括棋盘布局、空格位置、移动路径和步。 2. **StateHash结构体**:用于哈希表中的哈希函,以便快速查找已访问过的状态。 3. **toVector函**:将二维组转为一维组,方便计算逆序对。 4. **isSolvable函**:判断初始状态是否可解,基于逆序对和空格所在行的奇偶性。 5. **bfs函**:使用广度优先搜索(BFS)找到从初始状态到目标状态的最短路径,如果超过50步则认为不可解。 6. **main函**:读取输入,调用`isSolvable`函检查初始状态是否可解,然后调用`bfs`函求解路径并输出结果。 ### 知识点 1. **广度优先搜索(BFS)**:一种遍历或搜索树或图的算法,适用于寻找最短路径问题。 - BFS确保找到的路径是最短的,特别适合无权图或所有边权重相同的图。 2. **逆序对**:用于判断15码问题的可解性,计算初始排列中逆序对的量。 - 通过逆序对和空格所在行的奇偶性,可以确定初始状态是否可解。 3. **哈希表**:用于存储和查找已访问的状态,加速查找过程。 - 使用自定义哈希函加速状态的查找,避免重复计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值