编程题:计算数值的整数次方
思路:
虽然看起来很简单,但实际上需要考虑多种情况(其中num是底数,count是指数,res是结果):
1. 输入的num是否为0,count是否为0;如果num为0,输出0;如果count为0,输出1。
2. count是正整数:使用for循环逐次相乘。
3. count是负整数:先计算count为正数时的结果,再取其倒数。
代码实现:
方法1:使用for循环
如果count为32,则需要循环32次,时间复杂度为O(n)。
package com.example;
import java.util.Scanner;
/**
* 计算数值的整数次方
* @author Grey Wolf
*/
public class PowerCalculator {
public static void main(String[] args) {
PowerCalculator calculator = new PowerCalculator();
calculator.run();
}
private void run() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入底数和指数:");
while (scanner.hasNext()) {
double num = scanner.nextDouble();
int count = scanner.nextInt();
System.out.println("计算结果:" + calculatePower(num, count));
}
}
/**
* 计算数值的整数次方
* @param num 底数
* @param count 指数
* @return 结果
*/
private double calculatePower(double num, int count) {
double result = 1.0;
if (count == 0) {
return 1;
}
if (num == 0 && count != 0) {
return 0;
}
int absCount = Math.abs(count);
for (int i = 1; i <= absCount; i++) {
result *= num;
}
if (count <0) {
result = 1.0 / result;
}
return result;
}
}
方法2:使用递归
利用数学公式可以减少计算次数,时间复杂度为O(logN)。
package com.example;
import java.util.Scanner;
/**
* 计算数值的整数次方
* @author Grey Wolf
*/
public class PowerCalculator {
public static void main(String[] args) {
PowerCalculator calculator = new PowerCalculator();
calculator.run();
}
private void run() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入底数和指数:");
while (scanner.hasNext()) {
double num = scanner.nextDouble();
int count = scanner.nextInt();
double result = calculatePower(num, Math.abs(count));
if (count <0) {
result = 1.0 / result;
}
System.out.println("计算结果:" + result);
}
}
/**
* 利用数学公式计算数值的整数次方
* @param num 底数
* @param count 指数
* @return 结果
*/
private double calculatePower(double num, int count) {
if (count == 0) {
return 1;
}
if (count == 1) {
return num;
}
double result = calculatePower(num, count >> 1);
result *= result;
if (count % 2 == 1) {
result *= num;
}
return result;
}
}
测试效果:
输入整数和次方数:
0 0
计算结果:1.0
0 2
计算结果:0.0
2 2
计算结果:4.0
2 -2
计算结果:0.25
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。