您的位置:首页 > 其它

11_数值的整数次方

2017-07-17 17:19 351 查看
题目:实现double power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

需要注意的地方:

1、指数为负数时

2、底数为零且指数为负数时

更快的方法:

当n为偶数, a^n = a^(n/2) * a^(n/2)

当n为奇数, a^n = a^((n-1)/2) * a^((n-1)/2)) * a

利用右移一位运算代替除以2

利用位与运算代替了求余运算法%来判断一个数是奇数还是偶数

import java.util.Scanner;

public class Power {

static boolean g_InvalidInput = false;

// base:底数
// exponent:指数
static double power(double base,int exponent) {

g_InvalidInput = false;

if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;

// 当底数为0,指数为负时,需要做处理,不然会对0求倒数导致程序运行出错
// 并且通过一个全局变量告诉函数的调用者出现了这个错误
if( equal(base, 0.0) && exponent < 0){
g_InvalidInput = true;
return 0.0;
}

// absExponent:底数的绝对值
int absExponent = exponent;
if( exponent < 0 )
absExponent = -absExponent;

/*//第一种方法
double result = 1.0;
for(int i = 1; i <= absExponent ; ++i)
result *= base;*/

//第二种方法
double result = PowerWithUnsignedExponent(base, absExponent);

if( exponent < 0 )
result = 1.0 / result;

return result;
}

//更快的方法
static double PowerWithUnsignedExponent(double base, int exponent){

if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;

double result =PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
//按位做与运算,判断一个数是奇数还是偶数,等于1为奇数。
if( (exponent & 0x1) == 1)
result *= base;

return result;
}

//在计算机内表示小数时,都有误差,所以不能用==判断是否相等,只能判断他们之差的绝对值是不是在很小的一个范围内
static boolean equal(double num1,double num2) {
if( (num1 - num2) > -0.0000001 && (num1 - num2) < 0.0000001)
return true;
else
return false;
}

public static void main(String[] args) {
System.out.println("底数为:");
Scanner sc1 = new Scanner(System.in);
double sc11 = sc1.nextDouble();

System.out.println("指数为:");
Scanner sc2 = new Scanner(System.in);
int sc21 = sc2.nextInt();

System.out.println(sc11+"的"+sc21+"次方为:"+power(sc11,sc21));
sc1.close();
sc2.close();
}
}












内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: