一个幂运算

今天碰到一个面试题,要求呢是求 A的n次方。试着写了一下。开始只是简单的for循环相乘,后来发现java中最大的存储单位也存不下很大的数,所以后来想到了把乘法转为加法运算,并且利用每一位单独相加,来求最后的结果。

思路就是,例如 2的3次方。 就是 2* 2*2  用加法算就是  2+2 得到这个结果4,以后 在 4+4

如果说是 3的4次方 那就是  3*3*3*3 那就是 3+3+3得到结果9 ,之后又变成9+9+9得到结果27,之后变成 27+27+27 .。。

以此类推,就是用这样的思路解决这个问题,这样,即使是超出了浮点数表示范围也可以用字符串来表示计算结果

下面是源码和运行结果 。利用这种小技巧得到Math.pow得不到的结果

import java.util.Scanner;

public class myjava {
    public static void main(String[] args) {
        System.out.println("幂运算 A的n次方,请以此输入底数A与指数n ,输入结束请按回车");
        int A = 0;int n = 0;
        Scanner scan = new Scanner(System.in);
        A = Integer.parseInt(scan.nextLine());
        System.out.println("输入了底数:" + A);
        n = Integer.parseInt(scan.nextLine());
        System.out.println("输入了指数:" + n);
        scan.close();
        boolean isThan = false;
        long temp = 1;
        for (int i = 0; i < n; i++) {
            temp = temp * A;
            if (temp > Long.MAX_VALUE/A) {
                isThan = true;
                break;
            }
        }
        if (isThan) {
            System.out.println(A + "的" + n + "次方结果超出最大表示范围表示为"+Math.pow(A,n));
        } else {
            System.out.println(A + "的" + n + "次方结果为" + temp);
        }
        powtosum(A,n);
    }
    private  static void powtosum(int A,int n){
        String result="0";
        String  temp=A+"";
        for(int i=0;i<n-1;i++){
            result=0+"";
            for(int j=0;j<A;j++){
                result=sumString(result,temp);
//                System.out.println("result:"+result);
            }
            temp=result;
        }
        System.out.println("计算结果的字符串表示形式"+result);
    }
    private static String  sumString(String a,String b) {
        char[] arr3;
//        System.out.println("字符串为" +a+","+b);
        if (a.length() > b.length()) {
            arr3 = new char[a.length() + 1];
        } else {
            arr3 = new char[b.length()+ 1];
        }
        int  jw = 0;
        for (int i = 0; i < arr3.length - 1; i++) {
            int temp1=0;
//            System.out.println("i="+i);
            if(i<a.length()) {
                temp1=Integer.parseInt(String.valueOf(a.charAt(a.length()-i-1)));
            }

            int temp2 =0;
            if(i<b.length()){
                temp2=Integer.parseInt(String.valueOf(b.charAt(b.length()-i-1)));
            }
            String temp = temp1 + temp2 + jw + "";
//            System.out.println(temp1+","+temp2+","+jw);

            if (temp.length() > 1) {
                arr3[i] = temp.charAt(1);
                jw=Integer.parseInt(String.valueOf(temp.charAt(0)));
//                System.out.println("进位"+jw);
                    arr3[i + 1] =(jw+"").charAt(0);
            }else{
                arr3[i] = temp.charAt(0);
                jw=0;
            }
        }
        StringBuffer stringBuffer=new StringBuffer();
        for(int i=0;i<arr3.length;i++){
           stringBuffer.append(arr3[arr3.length-i-1]);
        }
         return  stringBuffer.toString().trim();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值