数据结构---数的操作
2015-07-29 20:53
429 查看
1.数值的整数次方(剑指offer-11)
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解析:这道题目有以下几点需要注意:
1.0的0次方是无意义的,非法输入
2.0的负数次方相当于0作为除数,也是无意义的,非法输入
3.base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
4.判断double类型的base是否等于0不能使用==号。因为计算机表述小数(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。
根据以上四个注意点,我们可以写出求指数的程序,代码:
2.打印1到最大的n位数(剑指offer-12)
题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
解析:当我们求最大的n位数的时候,是不是有可能用整型甚至长整型都会溢出?分析到这里,我们很自然的就想到我们需要表达一个大数,最常用的也是最容易实现的表达大数的方法是用字符串或者整型数组.n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。全排列可以用递归去写,递归结束条件是我们已经设置了数字的最后一位。
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解析:这道题目有以下几点需要注意:
1.0的0次方是无意义的,非法输入
2.0的负数次方相当于0作为除数,也是无意义的,非法输入
3.base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
4.判断double类型的base是否等于0不能使用==号。因为计算机表述小数(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。
根据以上四个注意点,我们可以写出求指数的程序,代码:
public static boolean isInvalidInput = false; // 判断输入是否合法 // 由于精度原因,double类型的变量不能用等号判断两个数是否相等,因此需要写equsl函数 public static boolean equal(double a, double b) { if ((a - b > -0.000001) && (a - b < 0.000001)) return true; else return false; } public static double Power(double base, int exponent) { // 如果底数为0且指数小于0,则表明是非法输入。 if (equal(base, 0.0) && exponent <= 0) { isInvalidInput = true; return 0; } int absExp; // 判断指数正负,去指数的绝对值 if (exponent < 0) absExp = -exponent; else absExp = exponent; double result = 1.0; for (int i = 0; i < absExp; i++) result *= base; // 如果指数小于0则取倒数 if (exponent < 0) result = 1 / result; return result; }
2.打印1到最大的n位数(剑指offer-12)
题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
解析:当我们求最大的n位数的时候,是不是有可能用整型甚至长整型都会溢出?分析到这里,我们很自然的就想到我们需要表达一个大数,最常用的也是最容易实现的表达大数的方法是用字符串或者整型数组.n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。全排列可以用递归去写,递归结束条件是我们已经设置了数字的最后一位。
// 打印输出时,要符合一般习惯,把前面的0去掉 public static void PrintNums(char[] numchar) { int i = 0; boolean flag = false; while (numchar[i] != '\0') { if (!flag && numchar[i] != '0') { flag = true; } if (flag) { System.out.print(numchar[i]); } i++; } System.out.println(); } public static void Print1ToMaxOfNDigitsRecursively(char[] numchar, int length, int index) { if (index == length - 1) { PrintNums(numchar); return; } for (int i = 0; i < 10; i++) { numchar[index + 1] = (char) (i + 48); Print1ToMaxOfNDigitsRecursively(numchar, length, index + 1); } } public static void Print1ToMaxOfNDigits_o(int n) { if (n <= 0) { System.out.println(" is illegal"); return; } char[] numchar = new char[n + 1]; numchar = '\0'; // 先对字符串数组初始化 for (int i = 0; i < 10; i++) { numchar[0] = (char) (i + 48); Print1ToMaxOfNDigitsRecursively(numchar, n, 0); } }总结:如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。
相关文章推荐
- 数据结构之---C++语言实现图的十字链表存储表示
- 数据结构录 之 主席树。
- 字典树 一种快速插入查询数据结构
- 例3.1 猜猜数据结构 UVa11995
- Hbase系统架构及数据结构
- 数据结构---位运算
- 有关java 数据结构
- 数据结构一:企业级顺序存储底层库封装
- 【算法与数据结构】二叉查找树算法实现
- [数据结构]二叉树之二叉链表的类模板实现
- opencv中keypoint数据结构分析
- 使用twig来组装数据使数据结构可视化
- Java数据结构-树的应用-二叉查找树
- 表、栈和队列
- 数据结构(三):非线性逻辑结构-树
- 图数据结构(期限、存储结构、遍历)
- 扩展数据结构--跳表(SkipList)
- 【数据结构】图的邻接矩阵存储实现
- java 数据结构之 顺序存储结构 串
- 数据结构1-3 灯塔