精华内容
下载资源
问答
  • 使用java实现pow(x,n)函数

    千次阅读 2017-10-16 00:07:21
    题目:实现Pow(x, n) 题目要求: 记住一个整数在-2147483648和2147483647的值之间 如果n = -2147483648,那么-n = 2147483648; 因此-n大于最大可能的整数值,因此-n不是整数。并记住,myPow的第二个输入...

    题目:实现Pow(x, n)

    题目要求:

    记住一个整数在-2147483648和2147483647的值之间
    如果n = -2147483648,那么-n = 2147483648; 因此-n大于最大可能的整数值,因此-n不是整数。并记住,myPow的第二个输入n必须是一个整数。因为这里传递的值(-n)不是int,所以编译器会报错

    然而,如果n = -2147483648,则 - (n + 1)= - (-2147483648 + 1)= 2147483647,其为整数; 然后我们可以将该值传递给myPow而不用编译器报错。

    代码如下:

    public static double myPow(double x, int n) {


    if (n > Integer.MAX_VALUE || n < Integer.MIN_VALUE)
    return 0;
    if (n == 0)
    return 1;
    if (n < 0) {
    return ((1 / x) * myPow(1 / x, -(n + 1)));

    //对于 negative integers (i.e, n = -2147483648).Example, x^(-3) = (1/x)^3 = (1/x) * (1/x)^2 = (1/x) * (1/x)^(-(-2)) = (1/x) * [(1/x)^(-(-3+1)] = 1/x * [(1/x)^2]
    }
    return (n % 2 == 0) ? myPow(x * x, n / 2) : x * myPow(x * x, n / 2);
    }

    展开全文
  • 面试 5:手写 Javapow() 实现。 我们在处理一道编程面试题的时候,通常除了注意代码规范以外,千万要记得自己心中模拟一个单元测试。主要通过三方面来处理。 功能性测试 边界值测试 负面性测试 不管如何,一定...

    面试 5:手写 Java 的 pow() 实现。

    我们在处理一道编程面试题的时候,通常除了注意代码规范以外,千万要记得自己心中模拟一个单元测试。主要通过三方面来处理。

    • 功能性测试
    • 边界值测试
    • 负面性测试

    不管如何,一定要保证自己代码考虑的全面,而不要简单地猜想用户的输入一定是正确的,只是去实现功能。通常你编写一个能接受住考验的代码,会让面试官对你刮目相看,你可以不厉害,但已经充分说明了你的靠谱。

    今天我们的面试题目是:

    面试题:尝试实现 Java 的 Math.pow(double base,int exponent) 函数算法,计算 base 的 exponent 次方,不得使用库函数,同时不需要考虑大数问题。

    面试题来源于《剑指 Offer》第 11 题,数字的整数次方。

    不要介意 Java 真正的方法是 Math.pow(double var1,double var2)。

    由于不需要考虑大数问题,不少小伙伴心中暗自窃喜,这题目也太简单了,给我撞上了,运气真好,于是直接写出下面的代码:

    public class Test11 {
    
        private static double power(double base, int exponent) {
            double result = 1.0;
            for (int i = 0; i < exponent; i++) {
                result *= base;
            }
            return result;
        }
    
        public static void main(String[] args) {
            System.out.println(power(2, 2));
            System.out.println(power(2, 4));
            System.out.println(power(3, 1));
            System.out.println(power(3, 0));
        }
    }
    复制代码

    写的快自然是好事,如果正确的话会被面试官认为是思维敏捷。但如果考虑不周的话,恐怕就极容易被面试官认为是不靠谱的人了。在技术能力和靠谱度之间,大多数面试官更青睐于靠谱度。

    我们上面确实做到了功能测试,但面试官可能会直接提示我们,假设我们的 exponent 输入一个负值,能得到正确值么?

    跟着自己的代码走一遍,终于意识到了这个问题,当 exponent 为负数的时候,循环根本就进不去,无论输入的负数是什么,都会返回 1.0,这显然是不正确的算法。

    我们在数学中学过,给一个数值上负数次方,相当于给这个数值上整数次方再求倒数。

    意识到这点,我们修正一下代码。

    public class Test11 {
    
        private static double power(double base, int exponent) {
            // 因为除了 0 以外,任何数值的 0 次方都为 1,所以我们默认为 1.0;
            // 0 的 0 次方,在数学书是没有意义的,为了贴切,我们也默认为 1.0
            double result = 1.0;
            // 处理负数次方情况
            boolean isNegetive = false;
            if (exponent < 0) {
                isNegetive = true;
                exponent = -exponent;
            }
            for (int i = 0; i < exponent; i++) {
                result *= base;
            }
            if (isNegetive)
                return 1 / result;
            return result;
        }
    
        public static void main(String[] args) {
            System.out.println(power(2, 2));
            System.out.println(power(2, 4));
            System.out.println(power(3, 1));
            System.out.println(power(3, -1));
        }
    }
    复制代码

    我们在代码中增加了一个判断是否为负数的 isNegetive 变量,当为负数的时候,我们就置为 true,并计算它的绝对值次幂,最后返回结果的时候返回它的倒数。

    面试官看到这样的代码,可能就有点按捺不住内心的怒火了,不过由于你此前一直面试回答的较好,也打算再给你点机会,面试官提示你,当 base 传入 0,exponent 传入负数,会怎样?

    瞬间发现了自己的问题,这不是犯了数学最常见的问题,给 0 求倒数么?

    虽然 Java 的 Math.pow() 方法也存在这个问题,但我们这里忽略不计。

    于是马上更新代码。

    public class Test11 {
    
    
        private static double power(double base, int exponent) {
            // 因为除了 0 以外,任何数值的 0 次方都为 1,所以我们默认为 1.0;
            // 0 的 0 次方,在数学书是没有意义的,为了贴切,我们也默认为 1.0
            double result = 1.0;
            // 处理底数为 0 的情况,底数为 0 其他任意次方结果都应该是 0
            if (base == 0)
                return 0.0;
            // 处理负数次方情况
            boolean isNegetive = false;
            if (exponent < 0) {
                isNegetive = true;
                exponent = -exponent;
            }
            for (int i = 0; i < exponent; i++) {
                result *= base;
            }
            if (isNegetive)
                return 1 / result;
            return result;
        }
    
        public static void main(String[] args) {
            System.out.println(power(2, 2));
            System.out.println(power(2, 4));
            System.out.println(power(3, 1));
            System.out.println(power(0, -1));
        }
    }
    复制代码

    有了上一次的经验,这次并不敢直接上交代码了,而是认真检查边界值和各种情况。检查 1 遍,2 遍,均没有发现问题,提交代码。

    计算机表示小数均有误差,这个在 Python 中尤其严重,但经数次测试,《剑指 Offer》中讲的双精度误差问题似乎在 Java 的 == 运算符中并不存在。如有问题,欢迎指正。

    上面的代码基本还算整,健壮性也还不错,但面试官可能还想问问有没有更加优秀的算法。

    仔细查看,确实似乎是有办法优化的,比如我们要求 power(2,16) 的值,我们只需要先求出 2 的 8 次方,再平方就可以了;以此类推,我们计算 2 的 8 次方的时候,可以先计算 2 的 4 次方,然后再做平方运算.....妙哉妙哉!

    需要注意的是,如果我们的幂数为奇数的话,我们需要在最后再乘一次我们的底数。

    我们尝试修改代码如下:

    public class Test11 {
        private static double power(double base, int exponent) {
            // 因为除了 0 以外,任何数值的 0 次方都为 1,所以我们默认为 1.0;
            // 0 的 0 次方,在数学书是没有意义的,为了贴切,我们也默认为 1.0
            double result = 1.0;
            // 处理底数为 0 的情况,底数为 0 其他任意次方结果都应该是 0
            if (base == 0)
                return 0.0;
            // 处理负数次方情况
            boolean isNegetive = false;
            if (exponent < 0) {
                isNegetive = true;
                exponent = -exponent;
            }
            result = getTheResult(base, exponent);
            if (isNegetive)
                return 1 / result;
            return result;
        }
    
        private static double getTheResult(double base, int exponent) {
            // 如果指数为0,返回1
            if (exponent == 0) {
                return 1;
            }
            // 指数为1,返回底数
            if (exponent == 1) {
                return base;
            }
            // 递归求一半的值
            double result = getTheResult(base, exponent >> 1);
            // 求最终值,如果是奇数,还要乘一次底数
            result *= result;
            if ((exponent & 0x1) == 1) {
                result *= base;
            }
            return result;
    
        }
    
        public static void main(String[] args) {
            System.out.println(power(2, 2));
            System.out.println(power(2, 4));
            System.out.println(power(3, -1));
            System.out.println(power(0.1, 2));
        }
    }
    复制代码

    完美解决。

    在提交代码的时候,还可以主动提示面试官,我们在上面用右移运算符代替了除以 2,用位与运算符代替了求余运算符 % 来判断是一个奇数还是一个偶数。让他知道我们对编程的细节真的很重视,这大概也就是细节决定成败吧。一两个细节的打动说不定就让面试官下定决心给我们发放 Offer 了。

    位运算的效率比乘除法及求余运算的效率要高的多

    因为移位指令占 2 个机器周期,而乘除法指令占 4 个机器周期。从硬件上看,移位对硬件更容易实现,所以我们更优先用移位。

    好了,今天我们的面试精讲就到这里,我们明天再见!

    我是南尘,只做比心的公众号,欢迎关注我。

    做不完的开源,写不完的矫情。欢迎扫描下方二维码或者公众号搜索「nanchen」关注我的微信公众号,目前多运营 Android ,尽自己所能为你提升。如果你喜欢,为我点赞分享吧~

    展开全文
  • Java_输入圆的半径,计算周长及面积

    万次阅读 2019-07-07 17:24:59
    Java_输入圆的半径,计算周长及面积 import java.util.Scanner; import static java.lang.Math.*; /* *输入圆的半径,计算圆的周长及面积并输出 *@author Chill_lyn * */ public class Circle{ public static...

    Java_输入圆的半径,计算周长及面积

    import java.util.Scanner;
    import static java.lang.Math.*;
    
    /*
     *输入圆的半径,计算圆的周长及面积并输出
     *@author Chill_lyn
     *
     */
    
    public class Circle{
    	public static void main(String[] args){
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Please input radius: ");
    		double radius = scanner.nextDouble();
    
    		System.out.println("####################");
    		System.out.println("Perimeter: "+radius*2*PI);
    		System.out.println("area: "+pow(radius, 2)*PI);
    	}
    
    }
    

    请注意这里使用了一个 静态引用 :

    import static java.lang.Math.*;
    

    所以代码中的PIpow()可以直接使用
    如果不使用静态引用,在代码中要写成Math.PIMath.pow()

    展开全文
  • (java) Pow(x, n)

    2016-02-16 22:41:23
    Implement pow(x, n). 思路:当n是正数时 当n是偶数等于half*half 当n是奇数时等于half*half*x; 当n是负数时,处理成正数,用1除就行了,注意边界当n等于Integer.MINVALUE时要特殊处理 代码如下(已通过leetcode)...

    Implement pow(xn).

    思路:当n是正数时 当n是偶数等于half*half 当n是奇数时等于half*half*x;

    当n是负数时,处理成正数,用1除就行了,注意边界当n等于Integer.MINVALUE时要特殊处理

    代码如下(已通过leetcode)

    public class Solution {
       public double myPow(double x, int n) {
        if(n==0) return 1.0;
        if(n<0) {
        if(n==Integer.MIN_VALUE) {
        return 1.0/myPow(x, -n-1)*x;
        }
        else return 1.0/myPow(x,-n);
        };
        double half=myPow(x, n>>1);
        if(n%2==0) return half*half;
        else return half*half*x;
       
       }
    }

    展开全文
  • java BigInteger的pow只能输入int ,想要求BigInteger的BigInteger的次方怎么求?
  • 实现pow函数,使用Java语言

    千次阅读 2017-03-27 11:23:53
    题目类别:实现Pow(x, n) 题目注意点: 记住一个整数在-2147483648和2147483647的值之间 如果n = -2147483648,那么-n = 2147483648; 因此-n大于最大可能的整数值,因此-n不是整数。并记住,myPow的第二个...
  • 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例2: ...来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/powx-n public double myPow(double x, int n) { //核心思想主要还是...
  • 50. Pow(x, n)(java)

    2020-01-27 09:06:27
    实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 ...
  • PTA46题(Java基础练习)

    万次阅读 多人点赞 2019-10-03 20:40:59
    Java作业练习(1) 这学期Java课的第一次作业嗷 (做完再删掉这句话) 我觉得可以 7-1 写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级 写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级...
  • java计算一元二次方程

    千次阅读 2019-08-21 14:40:33
    public class TestMath { public static void main(String[] args) { //一元二次方程的解法 System.out.println("计算一元二次方程"); Scanner sc=new Scanner... System.out.print("请输入a的值:")...
  • Java水仙花数

    千次阅读 2019-05-31 18:42:38
    要判断一个数是否为水仙花数,首先得弄清楚,该数个十百上的数立方相加是否等于...利用math.pow(x,y)函数相加,判断输入的值是否为水仙花数。 代码如下: Scanner input = new Scanner(System.in); System....
  • 【问题描述】[第50题][Pow(x, n)][中等] 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 输入: 2.10000, 3 输出: 9.26100 ...Java 代码中 int32 变量 n \in [-2147483648, 2147483647]n∈[−2147483
  • Java实现 LeetCode 50 Pow(x,n)

    万次阅读 多人点赞 2020-02-15 11:10:50
    50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4...
  • 链 接:https://leetcode-cn.com/problems/powx-n 解决方法: 用递归的做法讲复杂度降到O(logn)。 代码演示(参考网友的): public static double myPow(double x, int n) { if(n==0) return 1; if(n==1)...
  • JAVA判断三角形的类型

    万次阅读 多人点赞 2017-10-20 09:58:04
    JAVA判断三角形的类型
  • JAVA:二进制与十进制转换

    万次阅读 2017-07-12 21:24:48
    "输入0 结束,输入1 继续" ); sc = new Scanner(System.in); if (sc.nextInt()== 0 ){ break ; } } } public static void testD2B (){ while ( true ) { System.out.println( "Pleace ...
  • JAVA语言程序设计(基础篇)第十版课后题答案 第一章 第二题 /** Created by ysy on 2018/7/6. */ public class text2 { public static void main(String[] args){ for(int i = 0; i < 5; i++) System.out....
  • 不管如何,一定要保证自己的代码考虑的全面,而不要简单的猜想用户的输入一定是正确的,只是去实现功能。通常你编写一个能接受住考验的代码,会让面试官对你刮目相看,你可以不厉害,但已经充分说明了你的靠谱。 ...
  • 实现pow(x, n),即计算 x 的 n 次幂函数(即,xn)。 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x = 2.10000, n = 3 输出:9.26100 示例 3: 输入:x = 2.00000, n = -2 ...
  • public class Pow { public static void main(String[] args) { double res = myPow(2,-3); System.out.println(res); } //思路1:循环计算 n次 x相乘,时间复杂度O(n), 当n非常大时,效率低 public static ...
  • leetcode Pow(x,n) java

    2019-11-15 10:41:12
    实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: ...
  • Java对话框形式的输入

    千次阅读 2018-09-28 10:05:19
    //导入javax.swing包中的JOptionPane类,可以获取输入,类似Scanner public class ComputeLoanUsingDialog { public static void main(String[] args) { // TODO 自动生成的方法存根 ...
  • ACM标准输入输出JAVA版及性能优化

    千次阅读 2016-11-03 12:50:05
    这篇介绍ACM输入输出的java语言版本1. 输入①类形式:import java.util.*;import java.io.*;public class Main{public static void main(String[] args){ Scanner cin1 = new Scanner(System.in); Scanner cin2 = ...
  • 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x = 2.10000, n = 3 输出:9.26100 示例 3: 输入:x = 2.00000, n = -2 输出:0....
  • java不指定个数输入

    2020-01-01 14:07:47
    1.格式 while(in.hasNext()) { a[i]=in.nextInt();...(2)输入最后一个数后,再回车制造下一行 (3)Ctrl+z 才能得到结果 (4)编译器能识别,无需担心 3.样例 洛谷链接:https://www.luogu.com.cn/problemnew...
  • (还在更新中…) 这篇博客花费了我的大量时间和精力,从创作... 如果func为None,该函数的作用等同于zip()函数 计算绝对值: >>> list(map(abs, [-1, 0, 7, -8])) [1, 0, 7, 8] 计算乘幂: >>> list(map(pow, range(5)...
  • 事情是这个样子的 double d = 125; 在执行完语句 d = Math.pow(d,(double)1/3); 之后 d = 4.9999999999999; 请问怎么才能得到正确结果
  • 50. Pow(x, n)求x的n次幂题目描述思路实现 题目描述 Implement pow(x, n), which calculates x raised to the power n (xn). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,186
精华内容 9,674
关键字:

java输入pow

java 订阅