题目描述:模拟实现pow(x,y),x 和 y 均为整数(0不是整数)。
思路:x,y有可能为正整数,负整数,当指数 y 为负数时,先对指数求绝对值,然后算出次方的结果再求倒数。
方法1:一步一步求解,利用循环让 x 乘 x
方法2:递归求解,简化运算。以平方为单位求解。
Java实现
import java.util.Scanner;
public class MyPow {
// 一步一步运算,x 一次一次的乘
public static int pow1(int x,int y){
int ret = 1;
while(y-- != 0){
ret *= x;
}
return ret;
}
// 优化方法,递归思路,如求 8 次方,知道了 4 次方再平方就能得到结果
public static int pow2(int x,int y){
//一定要先判断指数是否为 1,否则找不到递归出口
if(y == 1){
return x;
}
int ret = pow2(x,y>>1);
ret *= ret;
if(1 == (y & 1)){
return ret * x;
}
return ret;
}
//该方法用来判断指数正负,以及在得到结果后,若指数为负则求倒数
public static double myPow(int x,int y){
if(y < 0){
return 1.0/pow1(x,-y);
// return 1.0/pow2(x,-y);
}
return pow1(x,y);
//return pow2(x,y);
}
// 测试用例
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int x = input.nextInt();
int y = input.nextInt();
while(x != 0 && y != 0){
System.out.println(myPow(x,y));
}
System.out.println("x,y均为整数,请重新输入!");
}
}
运行结果 :
C实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int Poweruint1(int a, unsigned int ex)//低效率
{
int ret = 1;
//for (unsigned int i = 0; i <= ex; i++){
// ret *= a;
//}
while (ex--){
ret *= a;
}
return ret;
}
int Poweruint2(int a, unsigned int n)//位运算效率比乘除法和求余运算高
{
if (1 == n){
return a;
}
int ret = Poweruint2(a, n >> 1);
//double ret = Poweruint2(a, n/2);
ret *= ret;
if (1 == (n & 1)){
ret *= a;
}
//if (1 == (n % 2)){
// ret *= a;
//}
return ret;
}
double Power(int base, int exponent)
{
double result = 1.0;
unsigned int ex = (unsigned int)exponent;
if (exponent < 0){//指数为负数时先转化为正数
ex = (unsigned int)(-exponent);
}
result = Poweruint1(base, ex);
//result = Poweruint2(base, ex);
if (exponent < 0){
result = 1.0 / result;
}
return result;
}
int main()
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
printf("%f\n", Power(x, y));
system("pause");
return 0;
}