经典算法问题的java实现 (一)
四年一闰;百年不闰;四百年再闰。
具体参照:http://baike.baidu.com/view/3085625.htm
- boolean isLeapYear(int year) {
- return (year%4 == 0 && year%100 !=0) || (year%400 == 0);
- }
2.如何判断一个数是否是质数(Prime Number)?
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
具体参照:http://baike.baidu.com/view/1767.htm
- boolean isPrimeNumber(int n) {
- int n1 = (int) Math.sqrt(n);
- for (int i = 2; i <= n1; i++) {
- if(n%i == 0) {
- return false;
- }
- }
- return true;
- }
注:这里n必须大于1。
3.分解质因数(Decomposition of prime factors)。
每个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。 分解质因数只针对合数。
求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。短除法求质因数:
具体参照:http://baike.baidu.com/view/832102.htm#1
- //返回质因数数组
- Integer[] decPrime(int n) {
- List<Integer> list = new ArrayList<Integer>();
- for (int i=2;i <= n;i++){
- while(n != i){
- if(n%i != 0){
- break;//不能整除肯定不是因数,能够整除在这里一定是质数。因为所有的2,3,5,7
- //都被除完之后。剩下的因数只能是奇数,且是质数。
- }
- list.add(Integer.valueOf(i));
- n = n/i;
- }
- }
- list.add(Integer.valueOf(n));
- return list.toArray(new Integer[list.size()]);
- }
4.求两个数的最大公约数(Greatest Common Divisor)。
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。辗转相除法使用到的原理很聪明也很简单,假设用f(x, y)表示x,y的最大公约数,取k = x/y,b = x%y,则x = ky + b,如果一个数能够同时整除x和y,则必能同时整除b和y;而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x, y)= f(y, x%y)(y > 0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。
具体参照:http://baike.baidu.com/view/47637.htm
- long gcd(long x,long y) {
- if(x < y) {
- long m = x;
- x = y;//x存储较大的一个数
- y = m;
- }
- long k = 0;
- while(y != 0) {
- k = x%y;
- x = y;
- y = k;
- }
- return x;
- }
5.求两个数的最小公倍数数(Least Common Multiple)。
几个数公有的倍数叫做这几个数的公倍数,其中最小的一个公倍数,叫做这几个数的最小公倍数。自然数a、b的最小公倍数可以记作[a,b],自然数a、b的最大公因数可以记作(a,b),当(a,b)=1时,[a,b]= a×b。
两个数的最大公因数和最小公倍数有着下列关系:
最大公因数×最小公倍数=两数的乘积
即(a,b)×[a,b]= a×b 。
证明:设 a = x*(a,b),b = y*(a,b) 其中x,y不存在公约数。
a * b = [x * (a,b)] * [y * (a,b)]
= [x * y * (a,b)] * (a,b)
= [a,b] * (a,b)
具体参照:http://baike.baidu.com/view/341375.htm#2
- long lcm(long x,long y) {
- return x*y/gcd(x,y);
- }
6.求完数(Perfect Number)。
完数,即完美数,一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3.(6的因子是1,2,3)
具体参照:http://baike.baidu.com/view/640632.htm
http://zjtys-2006.blog.sohu.com/164964518.html
- boolean isPerfectNumber(long n) {
- int s = 0 ;
- //迭代求出所有因子之和
- for (int i = 1; i < n; i++) {
- if(n%i == 0) {
- s +=i;
- }
- }
- //判断该数是否等于它的因子之和,是则是完数。
- if( s == n) {
- return true;
- }
- return false;
- }
7.水仙花数(Daffodils Number)。
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
具体参照:http://baike.baidu.com/view/152077.htm
- //该算法使用的是基本数据类型,只能计算出少量“水仙花数”。建议感兴趣的读者用BigInteger来求“水仙花数”。
- boolean isDaffodilsNumber(long l) {
- char [] c = String.valueOf(l).toCharArray();
- int d = 0,n = c.length;
- long sum = 0;
- for (int i = 0; i < c.length; i++) {
- d = c[i]-'0';
- sum += Math.pow(d, n);//可能存在精度丢失现象
- }
- if(sum == l) {
- return true;
- }
- return false;
- }
8.回文数字(Palindrome Number)。
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:121,323.....
判断一个数字是否是回文的方法如下:
- boolean isPalindromeNumber(long l) {
- char [] c = String.valueOf(l).toCharArray();
- int len = c.length/2;
- for (int i = 0; i < len; i++) {
- if(c[i] != c[c.length-1-i]) {
- return false;
- }
- }
- return true;
- }
9.牛顿迭代法求平方根(Newton's Method)。
计算机本身不能开平方,开平方运算是用程序实现的。
具体参照:http://baike.baidu.com/view/643093.htm#2
http://wenku.baidu.com/view/6b74c622bcd126fff7050bfe.html
- /**
- * 求平方根
- * @param d 待开方数
- * @param precision 算术平方根的精度
- * @return
- */
- double sqrt(double d,double precision) {
- double x1 = d/2, x2 =(x1 + d/x1)/2;
- while(Math.abs(x2 -x1)>precision) {
- x1 = x2;
- x2 =(x1 + d/x1)/2;
- }
- return x1;
- }
10.奇偶数快速判断(odd even)。
判断奇数和偶数的方法,一般是除以2或者对2取模运算,结果为0则是偶数反之则是奇数。
在计算机内部数都是用二进制表示的,奇数最低位上一定是1,偶数为0。基于这个特点可以
利用按位与运算进行奇偶数判断。
- //如果是奇数返回true,否则是偶数 则返回false。
- boolean isOdd(long l) {
- if((l & 0x01) == 0) {
- return false;
- }
- return true;
- }
注:在计算机中 除法运算速度 < 模运算速度 < 按位与运算速度
- TypicalCode.rar (1.4 KB)
经典算法问题的java实现 (一)的更多相关文章
- 经典算法问题的java实现 (二)
原文地址: http://liuqing-2010-07.iteye.com/blog/1403190 1.数值转换(System Conversion) 1.1 r进制数 数N的r进制可以表 ...
- 经典算法--冒泡排序(Java)
原理:将相邻元素的较大值赋给右边 思路:① 1.将集合或数组内的第一个元素与第二个元素进行比较,较大值赋给右边: 2.将第二个元素与第三个元素进行比较,较大值赋给右边: ....... (N-1).将 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- JAVA经典算法40题及解答
JAVA经典算法40题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...
- Java经典算法四十例编程详解+程序实例
JAVA经典算法40例 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程 ...
- JAVA经典算法40题
1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...
- JAVA经典算法40题(原题+分析)之分析
JAVA经典算法40题(下) [程序1] 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: ...
- JAVA经典算法40题(原题+分析)之原题
JAVA经典算法40题(上) [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [程 ...
随机推荐
- C++ Msi函数判断应用是否已经安装
#include <Windows.h> #include <Msi.h> #pragma comment(lib, "Msi.lib") bool Che ...
- RE:从零开始的莫比乌斯反演
炫酷反演魔术根本看不懂啊...也就看看PoPoQQQ的ppt了. 这个赛季结束了,一年可以学很多很多东西呢. 因为我是写给自己看的所以写的很垃圾. 公式: 按我的理解,反演就是 x可以表示成y,然后 ...
- mybatis11--多对多关联查询
多对多关联! 其实就是两个一对多的关联! 比如说 一个学生可以有多个老师!一个老师可以有多个学生! 那么 学生和老师之间的关系 可以理解为 多对多的关联关系! 关键是怎么建立数据库中两个表之间的关系 ...
- 让ADO.NET Entity Framework支持Oracle数据库
Oracle最近发布了 Oracle Data Access Component(ODAC)11. 2 Rel 4,其中增加了对 Entity Framework 4.1 和4.2的支持.这让 .NE ...
- 七牛 qshell 全命令实践
七牛API服务的命名行测试工具,参考文档 七牛开发者中心 命令行工具(qshell) 实践目的 安装 account 设置ak.sk stat 查看文件状态 buckets/listbucket/do ...
- 用vue制作饿了么首页(1)
无论是静态网页还是动态交互网页,实现原则是将他们分块,然后各个击破. 很明显的饿了么首页分为三个部分(组件), 上面的头部(商家信息), 中间路由 购物车 每部分先占住自己位置,然后挨个将这三部分分别 ...
- ThinkPHP缓存技术(S(),F(),查询缓存,静态缓存)
直接查看原网址 https://blog.csdn.net/u010081689/article/details/47976271
- python全栈开发 * 20 继承知识点汇总 * 180530
20 面向对象的三大特征之一(继承,多态,封装) -----继承 1.继承的定义: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类;父类又可称为基类或超类,新建的类称为派生 ...
- 实时分析(在线查询),firehose---clickhouse
firehose---clickhouse 在Hive中适不适合像传统数据仓库一样利用维度建模hive新功能 Cube, Rollup介绍https://blog.csdn.net/moon_yang ...
- post方式接口测试(二)_参数化
一.在postman中可设置环境变量和全局变量 二.设置好后直接在请求中使用: 三.get请求,需要将参数直接出现在URL上,直接点击 Params