1000以内的回文素数
2016-05-16 22:00
686 查看
问题描述:回文数是指一个数无论从左到右还是从右到左读都是一样的数字;比如33,121,323,45654、、、、等具有对称特征的数字;
根据以上描述求1000以内的回文素数;
完整代码:
问题分析:
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;
5、回文数的代码表示:
这个代码中间语句执行的次数为1000次;
想办法简化之后可以得到这样一个代码:
优化之后代码中间语句的的执行次数就降低变成110次,效率提高了近百分之八十(因为是1000以内 所以我们只用单纯的考虑2位和3位的情况就可以);
根据以上描述求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位的情况就可以);
相关文章推荐
- 高效使用xcode
- leetcode(10),Roman to Integer(python)
- BZOJ_1507_Editor_[NOI2003]_(Splay)
- Viewpager+Fragment 实现滑动切换显示内容
- android开发第一次心的
- 5.swift关键字和符号
- 数据类型包装类,String,对象的复制
- 欢迎使用CSDN-markdown编辑器
- ./configure详解
- JAVA学习笔记整理一(基础知识)
- Problem-D
- 18-Python网络编程
- 学生信息管理系统——指针和链表的应用
- 机器学习(一)------- 线性回归(Linear regression )
- SpringMVC注解@RequestParam全面解析---打酱油的日子
- 二分答案方法、
- 中国UTM分区
- 20160516
- 初识AngularJS
- 面试笔试题总结