编程题:数值的整数次方
思路:
看起来挺简单,就是一个数学的乘法。但得考虑几种情况(num是底数,count是次方数,res是结果):
1.输入的num是否为0,count是否为0;num为0,输出0;count为0,输出1。
2.count是整数:直接用for循环求res*=num;
3.count是负数:先取count的整数时res*=num的值,再求res=1.0/res为最后的值。
代码:
1.直接用for循环实现,如果count为32,则要循环32次。复杂度为O(n).
2.利用一个数学公式:分析为如果count为32,我们只要求出count=16时的值,再平方一次就行了,以此类推,可以利用递归实现,复杂的为logN.
a^n={a^n/2 * a^n/2} n 为偶数 a^n={a^(n-1)/2 * a^(n-1)/2 * a} n 为奇数
方法1:
package com.mmall; import com.mmall.model.User; import java.util.Scanner; /** * Created by ASUS on 2018/7/13 * * @Authod Grey Wolf */ public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); test1.sys(); } private void sys() { Scanner scan = new Scanner(System.in); System.out.println("输入整数和次方数:"); while (scan.hasNext()) { double num = scan.nextDouble(); int count = scan.nextInt(); System.out.println("数值的整数次方结果是-->" + getRes(num, count)); } } /** * 数值的整数次方 * @param num 数值 * @param count 整数次方 * @return */ private double getRes(double num, int count) { double res=1.0 ; if (count == 0){ res = 1; } if (num==0&&count!=0){ res=0; } int i; int time=Math.abs(count); for (i = 1; i <= time; i++) { res *= num; } if (count < 0) { res = 1.0 / res; } return res; } }
方法2:
package com.mmall; import com.mmall.model.User; import java.util.Scanner; /** * Created by ASUS on 2018/7/13 * * @Authod Grey Wolf */ public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); test1.sys(); } private void sys() { Scanner scan = new Scanner(System.in); System.out.println("输入整数和次方数:"); while (scan.hasNext()) { double num = scan.nextDouble(); int count = scan.nextInt(); int time=Math.abs(count); double res=getRes1(num,time); if (count<0){ res=1.0/res; } System.out.println("数值的整数次方结果是-->" + res); } } /** * 根据数学公式: * a^n={a^n/2 * a^n/2} n 为偶数 * a^n={a^(n-1)/2 * a^(n-1)/2 * a} n 为奇数 * @param num * @param count * @return */ private double getRes1(double num, int count) { double res=1.0; if (count==0){ return 1; } if (count==1){ return num; } res=getRes1(num,count>>1); res*=res; if (count%2==1){ res*=num; } return res; } }
效果:
输入整数和次方数:
0 0
数值的整数次方结果是-->1.0
0 2
数值的整数次方结果是-->0.0
2 2
数值的整数次方结果是-->4.0
2 -2
数值的整数次方结果是-->0.25
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。