1.数值转换(System Conversion)
1.1 r进制数
数N的r进制可以表示为:
1.2 十进制转换为r进制
十进制数N和其他r进制数的转换是计算机实现计算的基本问题,基解决方案很多,其中一个简单算法基于下列原理:
N = (N div d) * r + N mod r (其中: div为整除运算,mod为求余运算)
问题:如何将非负十进制(Decimal)整数转化为八进制数(Octonary Number)?
将十进制转化为r进制:
- /**
- * 非负十进制整数转换为r进制数
- * @param n 待转换的十进制数
- * @param r 进制数(基数)
- * @return 返回转换后对应r进制数各位数字。
- */
- byte [] dec2RNumber(int n,byte r) {
- if(n < 0 || r < 0) {
- throw new IllegalArgumentException(" the parameter is valid!");
- }
- Stack<Byte> s = new Stack<Byte>();
- while( n != 0){
- s.push(Byte.valueOf((byte) (n%r)));//求余
- n = n/r;//求商
- }
- byte [] rr = new byte[s.size()];
- for (int i = 0; i < rr.length; i++) {
- rr[i] = s.pop();
- }
- return rr;
- }
十进制非负整数转换为八进制:
- dec2RNumber(1348,8)
2.斐波那契数列(Fibonacci Sequence)
2.1 斐波那契数列是以递归的方法来定义:
斐波那契数列是从第0项和第1项开始,之后的项等于其前面相邻两项之和。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,......
2.2 兔子生育问题:
- 第一个月初有一对刚诞生的兔子
- 第二个月之后(第三个月初)它们可以生育
- 每月每对可生育的兔子会诞生下一对新兔子
- 兔子永不死去
2.3 兔子问题的分析:
斐波那契数列的java非递归实现:
- int Fibs(int n) {
- if(n < 0) {
- throw new IllegalArgumentException(" the parameter is valid!");
- }
- int n1 = 0;//F(n-2)
- int n2 = 1;//F(n-1)
- int r = n1;//F(n)
- if(n == 1) {
- r = n2;
- }
- for (int i = 2; i <= n; i++) {
- r = n1 + n2 ;//F(n)=F(n-1)+F(n-2)
- n1 = n2;
- n2 = r;
- }
- return r;
- }
参照资料:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97#.E6.87.89.E7.94.A8
3.秦九韶算法求一元n次多项式的值(Compute Polynomial's value)
3.1 秦九韶算法介绍:
秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。在西方被称作霍纳算法。
秦九韶算法:
一般地,一元n次多项式的求值需要经过[n(n+2)]/2次乘法和n次加法,而从上面的演算可以看出秦九韶算法只需要n次乘法和n次加法。极大地降低了算法复杂度。
参照:http://zh.wikipedia.org/wiki/%E9%9C%8D%E7%B4%8D%E6%BC%94%E7%AE%97%E6%B3%95
3.2 秦九韶算法实现:
- /**
- * 秦九绍算法求一元n次多项式的值
- * f(x) = a[0]*x^n + a[1]*x^(n-1) + ... + a[n]
- * @param a 系数
- * @param x 基数
- * @return
- */
- double qinjiushao(double [] a ,double x) {
- double v = a[0];
- for (int i = 1; i < a.length; i++) {
- v = v * x + a[i];
- }
- return v;
- }
3.3 秦九韶算法应用:
在Java中字符串的hashcode计算中就用到了秦九韶算法。其中基数为31(质数),系数为字符串对应的ASCII值。
- public int hashCode() {
- int h = hash;
- if (h == 0) {
- int off = offset;
- char val[] = value;
- int len = count;
- for (int i = 0; i < len; i++) {
- h = 31*h + val[off++];
- }
- hash = h;
- }
- return h;
- }
测试:
- System.out.println("abc".hashCode());
- 结果:96354 = ax^2 + bx +c //其中( [a,b,c]=[97,98,99];x =31)
- = 97 * 961 + 98 * 31 +99