C++筛选左移排列全为素数的算法运行到11后死循环问题
左移全素数筛选代码卡死问题排查
需求说明
给定上限m,输出所有小于m、且各位数字左移排列后的所有结果均为素数的数。代码运行到数字11后就卡住,最初猜测问题出在偶数判断逻辑上。
代码函数功能说明
代码中4个函数的功能分别为:
- 读取输入的上限值m
- 判断输入数字是否为素数
- 将输入数字的各位左移一位生成新数,例如输入1234返回2341
- 实现核心筛选逻辑
完整问题代码
#include <iostream> #include <cmath> using namespace std; ///In: - ///Out: m - limita void citireDate(int &m) { cout << "Limita m: "; cin >> m; } ///In: un numar ///Out: k, care poate lua valori de 0 sau 1: 0 = prim /// 1 = neprim int prim(int nr) { int d = 2, k = 0; while(d*d<=nr&&k==0) { if(nr%d==0) k=1; d++; } return k; } ///In: un numar ///Out: numarul format prin permutarea cifrelor numarului primit spre stanga int permutareStanga(int nr) { int nrCif = log10(nr); int putere = pow(10.0, nrCif); int primaCif = nr / putere, restCif = nr % putere; return restCif*10 + primaCif; } ///In: m ///Out: numerele prime permutabile, mai mici decat m; void algoritmPermutabile(int m) { for(int i = 11; i<m; i++) { int primalitate = prim(i); if(primalitate==0) { int p = permutareStanga(i); int k1 = 0; while(k1==0&&p!=i) { int d1 = 2, k2=0; while(d1*d1<=p&&k2==0) { if(p%d1==0) k2=1; } if(k2==1) k1=1; permutareStanga(p); } if(k1==0) cout << i << " "; } } } int main() { int m; citireDate(m); algoritmPermutabile(m); cout<<"\nProgram terminat"; return 0; }
问题根因
核心逻辑的内层素数判断循环中,变量d1没有写自增逻辑,导致d1始终等于2,只要当前判断的数不能被2整除,循环就会一直运行,程序陷入无限循环。
补充修复提示:代码还存在另一个隐性问题:permutareStanga(p)的返回值没有赋值给p,会导致左移操作的结果没有被保存,左移循环无法正常终止,修复时需要改成p = permutareStanga(p)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

