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