2的N次方
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1735 测试通过:850
方法1:传统方法,用数组模拟计算和进位。对于每次乘2,从最后一位开始,乘2,如果有进位,那么此位的值为乘积%10;前面的数,乘2后,判断后面是否有进位,有进位那么加1,再判断此位是否有进位。 从后位遍历到第一位,即可以得到最终结果。
方法二:利用JAVA大数处理(BigInteger,BigDecimal)
对于方法一:代码可做简化为:
总提交:1735 测试通过:850
描述
编程精确计算2的N次方。(N是介于100和1000之间的整数)。
输入
正整数N (100≤N≤1000)
输出
2的N次方
样例输入
200
样例输出
1606938044258990275541962092341162602522202993782792835301376
题目来源
NUPT
private static final int MAX=2000;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
fun1(n);
}
方法1:传统方法,用数组模拟计算和进位。对于每次乘2,从最后一位开始,乘2,如果有进位,那么此位的值为乘积%10;前面的数,乘2后,判断后面是否有进位,有进位那么加1,再判断此位是否有进位。 从后位遍历到第一位,即可以得到最终结果。
private static void fun(int n) {
int[] arr=new int[MAX];
int index=0;
arr[0]=2;
for(int i=1;i<n;i++){
int jinwei=0;
for(int j=0;j<=index;j++){
int temp=1;
if(j==0){
temp=arr[j]*2;
if(temp>=10){
jinwei=1;
}
}else{
temp=arr[j]*2;
if(jinwei==1){
temp+=1;
}
if(temp>=10){
jinwei=1;
}else{
jinwei=0;
}
}
arr[j]=temp%10;
}
if(jinwei==1){
index++;
arr[index]=1;
}
}
for(int i=index;i>=0;i--){
System.out.print(arr[i]);
}
}
方法二:利用JAVA大数处理(BigInteger,BigDecimal)
在用C或者C++处理大数时感觉非常麻烦,但是在JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。这两个类都在java.math.*包中,因此每次必须在开头处引用该包。
private static void fun1(int n) {
BigInteger a=BigInteger.valueOf(1);
BigInteger b=BigInteger.valueOf(2);
for(int i=0;i<n;i++){
a=a.multiply(b);
}
System.out.println(a);
}
对于方法一:代码可做简化为:
private static void fun(int n) {
int[] arr=new int[MAX];
int index=0;
arr[0]=2;
for(int i=1;i<n;i++){
int jinwei=0;
for(int j=0;j<=index;j++){
int temp=0;
/*if(j==0){
temp=arr[j]*2;
if(temp>=10){
jinwei=1;
}
}else{
temp=arr[j]*2;
if(jinwei==1){
temp+=1;
}
if(temp>=10){
jinwei=1;
}else{
jinwei=0;
}
}*/
//以上代码可以化简 因为在j=0时,jinwei=0
temp=arr[j]*2+jinwei;
if(temp>=10){
jinwei=1;
}else{
jinwei=0;
}
arr[j]=temp%10;
}
if(jinwei==1){
index++;
arr[index]=1;
}
}
for(int i=index;i>=0;i--){
System.out.print(arr[i]);
}
}