南邮acm 1009 2的N次方 java解法

2的N次方

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:1735            测试通过:850

描述

编程精确计算2的N次方。(N是介于100和1000之间的整数)。

输入

正整数N (100N1000)

输出

2N次方

样例输入

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]);
		}
	}


你可能感兴趣的:(java,ACM,2的n次方,大数处理)