题目描述
实现一个算法得到乌托邦树的高度。介绍如下:
乌托邦树每年经历2个生长周期。每年春天,它的高度都会翻倍。每年夏天,他的高度都会增加1米。
对于一颗在春天开始时种下的高1米的树,问经过指定周期后,树的高度为多少?
输入描述
输入一个数字N(0<=N<=1000),表示指定周期。 例如,样例输入: 3
输出描述
输出一个数字,为经过指定周期后树的高度。 例如,对应输出: 6
如果采用寻常的数据描述形式,本题数据太大,会造成溢出,因此采用高精度描述,一下给出两种Java高精度描述的方式。
参考代码
public static void main(String[] args) {
int n;//树的生长周期数
short height[] = new short[1000000];
int k = 1;//树高的位数
Scanner in = new Scanner(System.in);
n = in.nextInt();
height[0]=1;//刚种下时为1米
while (n > 0) {
for (int i = 0; i < k; i++) {//每年春天,树高度翻倍,相当于每一位都乘二
height[i] *= 2;
}
n--;//周期数减一
if (n == 0) break;
height[0] += 1;//每年夏天,树高度加一
for (int i = 0; i < k; i++) {//大于10的位数需要进位
height[i + 1] += height[i] / 10;
height[i] %= 10;
}
if(height[k]!=0)k++;//位数加1
n--;
}
for (int i = k-1; i >=0 ; i--) {
System.out.print(height[i]);
}
System.out.println();
}
参考代码
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
BigInteger height = new BigInteger("1");
while (a > 0) {
height = height.add(height);//春天翻倍
a--;
if (a == 0) break;
height=height.add(new BigInteger("1"));//夏天加一
a--;
}
System.out.println(height);
}