又是今天的面试题,上级操作,linux环境文本编辑器下写代码;
题目大概就是说:给一个数,先求出这个数的阶层。在这个阶层的基础上把各个位相加比如:阶层结果=56
相加 5+6=11;要求给出的是输入100 输出相加的结果;
import java.math.BigInteger;
/*
* 求一个数的阶层,得到的数字每个位相加,输出最终相加的数字;
*/
public class NumberCount {
public static void main(String[] args) {
NumberCount cu = new NumberCount();
long star1 = System.currentTimeMillis();
int ree = cu.count(new BigInteger(1000+""));
System.out.println("ree"+ree+"用时:"+(System.currentTimeMillis()-star1));
long star2 = System.currentTimeMillis();
BigInteger amount = cu.Calculate(BigInteger.valueOf(1000));
System.out.println(amount);
int [] a = new int[500];
int real =0;
int result =cu.countInt(amount, 0, a,real);
System.out.println();
System.out.println(result+"用时:"+(System.currentTimeMillis()-star2));
}
private BigInteger Calculate(BigInteger num) {
//System.out.println(num);
if(num.intValue() ==1) {
return BigInteger.ONE;
}
if(num.intValue() > 1) {
return num.multiply(Calculate(BigInteger.valueOf((num.subtract(BigInteger.valueOf(1))).longValue())));
}
return BigInteger.ONE;
}
public int count(BigInteger c) {
BigInteger re = Calculate(c);
System.out.println(re);
String str = re.toString();
char[] ch = str.toCharArray();
int result = 0;
for(int i=0; i<ch.length; i++) {
result += Integer.parseInt(ch[i]+"");
}
return result;
}
/**
* 求模的方式,效率似乎没字符串方式高
* @param num
* @param index
* @param a
* @return
*/
public int countInt(BigInteger num,int index,int[] a,int result) {
//int leg = index+1;
//if(leg==a.length) {
//数组自动加长
// a = Arrays.copyOf(a, leg+10);
//}
//求模,得到个位数
BigInteger bit = num.mod(BigInteger.valueOf(10));
//把个位数放入数组
//a[index]= bit.intValue();
//把个位数直接跟结果相加
result +=bit.intValue();
BigInteger newpNum = num.subtract(bit);
//除去个位
BigInteger newNum = newpNum.divide(BigInteger.valueOf(10));
if(newNum.compareTo(BigInteger.valueOf(10))<0) {
//a[++index] = newNum.intValue();
result +=newNum.intValue();
return result;
}
return countInt(newNum,index+1,a,result);
}
}
public class BigInteger extends Number implements Comparable<BigInteger> {