数据结构---数的操作

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类型的数相等。

根据以上四个注意点,我们可以写出求指数的程序,代码:

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[n] = '\0'; // 先对字符串数组初始化

		for (int i = 0; i < 10; i++) {
			numchar[0] = (char) (i + 48);
			Print1ToMaxOfNDigitsRecursively(numchar, n, 0);
		}
	}
总结:如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值