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

12 篇文章 0 订阅
10 篇文章 0 订阅

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值