X^Y,X和Y均为整数

题目描述:模拟实现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;
}

C语言实现数值的整数次方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值