编程题:数值的整数次方

编程题:数值的整数次方

思路:

看起来挺简单,就是一个数学的乘法。但得考虑几种情况(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

我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰太狼_cxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值