今天碰到一个面试题,要求呢是求 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();
}
}