一、题目链接
http://noi.openjudge.cn/ch0106/12/
二、解题思路
◎ 根据题意,乘2的次数为n次;
◎ 从低位到高位,用当前结果的每一位数字乘2,同时加上上一次的进位,形成新的计算结果。
三、实施步骤
四、Java程序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
/**
* 计算2的给定次方
*
* @param n int类型的整数,代表给定次方
* @return int类型的数组,存储2的n次方
*/
public int[] powerOfTwo(int n) {
int[] ans = new int[50]; // 存储2的n次方
ans[0] = 1; // 计算基数为1
int m = 1; // 计算结果的实际长度,初始为1
int carry; // 每次运算产生的进位
int i;
int j;
/* 乘2的次数为n次 */
for (i = 1; i <= n; i++) {
carry = 0; // 当前进位,初始为0
/* 从当前结果的最低位开始,每个数位都要和2相乘 */
for (j = 0; j < m; j++) {
ans[j] = ans[j] * 2 + carry; // 当前数位乘2,同时加上上一次的进位
if (ans[j] > 9) { // 如果当前数位计算结果超过9
carry = ans[j] / 10; // 当前数位的十位数构成进位
ans[j] = ans[j] % 10; // 当前数位仅保留个位数
}
else { // 否则,当前数位计算结果为个位数
carry = 0; // 进位为0
}
}
if (carry > 0) { // 如果本次乘2运算产生更高一位的进位
ans[m] = carry; // 最高位数字就是当前的进位
m++; // 结果实际长度加1
}
}
/* 计算结果中,小的下标代表低的位数,因此需要返回结果的倒序 */
for (i = 0; i < m / 2; i++) {
j = ans[i];
ans[i] = ans[m - i - 1];
ans[m - i - 1] = j;
}
return Arrays.copyOfRange(ans, 0, m); // ans[0]~ans[m-1]构成最终计算结果
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int[] ans = test.powerOfTwo(N);
for (int i : ans) {
System.out.print(i);
}
}
}