您的位置:首页 > 其它

1000以内的回文素数

2016-05-16 22:00 686 查看
问题描述:回文数是指一个数无论从左到右还是从右到左读都是一样的数字;比如33,121,323,45654、、、、等具有对称特征的数字;

根据以上描述求1000以内的回文素数;

完整代码:

#include <iostream>

#include <math.h>


bool judge(unsigned n)

{

if (n < 2) return 0;

if (n == 2) return 1;

for (int i(3); i < sqrt(n); ++i)

{

if (n % i == 0)

return 0;

}


return 1;

}

void judgeHuiwen()

{

//两位回文素数

for (int i(1); i < 10; ++i)

{

int temp = i * 10 + i;

if (judge(temp))

std::cout << temp <<"\t";

}

//三位回文素数

for (int i(1); i < 10; ++i)

{

for (int j(0); j < 10; ++j)

{

int temp = i * 100 + j * 10 + i;

    if (judge(temp))

  std::cout << temp <<"\t";

}

}

}

int main()

{

judgeHuiwen();

return 0;

}


问题分析:

1、可以先把问题分解:1、回文数的筛选;2、素数判断;

2、回文数:第一位和最后一位相等,第二位和次高位相等,第三位和倒数第三个相等、、、、的数字;

3、素数:只有一和它本身两个约数;

4、素数的代码表示:

0,1,不是素数,2是素数剩下的除了一和它本身无其他约数:

如果n = 0或者1,return 0;

如果n = 2 return 1;

如果n / i != 0 (i = 3,4,5,6,7,8,、、、、、sqrt(n)) return 1;

否则return 0;

bool judge(unsigned n)

{

if (n < 2) return 0;

if (n == 2) return 1;

for (int i(3); i < sqrt(n); ++i)

{

if (n % i == 0)

return 0;

}


return 1;

}

5、回文数的代码表示:

void judgeHuiwen()

{

for (int i(0); i < 10; ++i)

{

for (int j(0); j < 10; ++j)

{

if (i == 0 && j == 0)

continue;

for (int k(0); k < 10; ++k)

{

if (i != 0 && i != k)

    continue;

int s = i * 100 + j * 10 + k;

int t = k * 100 + j * 10 + i;

if (i == 0)

t /= 10;

if (s > 10 && s == t)

if (judge (s))

std::cout << s << "\t";

}

}

}

return;

}

这个代码中间语句执行的次数为1000次;

想办法简化之后可以得到这样一个代码:

void judgeHuiwen()

{

//两位回文素数

for (int i(1); i < 10; ++i)

{

int temp = i * 10 + i;

if (judge(temp))

std::cout << temp <<"\t";

}

//三位回文素数

for (int i(1); i < 10; ++i)

{

for (int j(0); j < 10; ++j)

{

int temp = i * 100 + j * 10 + i;

    if (judge(temp))

  std::cout << temp <<"\t";

}

}

}

优化之后代码中间语句的的执行次数就降低变成110次,效率提高了近百分之八十(因为是1000以内 所以我们只用单纯的考虑2位和3位的情况就可以);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: