一個冪運算

今天碰到一個面試題,要求呢是求 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();

    }

}

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 8037
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章