首页 > 试题广场 >

2的N次方

[编程题]2的N次方
  • 热度指数:4603 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
对于一个整数N(512 <= N <= 1024),计算2的N次方并在屏幕显示十进制结果。

输入描述:
输入一个整数N(512 <= N <= 1024)


输出描述:
2的N次方的十进制结果
示例1

输入

512

输出

13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

简单的字符串模拟乘2运算即可

#include <string>
#include <iostream>
using namespace std;

string NPowerOf2(int n){
    string res("1");

    for( int i =0;i < n; ++i){
        int carry = 0, multi= 0;
        for(int j = res.size( )-1; j >= 0; --j){
            int tmpNum = res[j] - '0';
            multi= (tmpNum<<1) + carry;
            carry = multi/10;  
            res[ j] = (multi%10) + '0';
        }
        if( carry> 0)
            res.insert(res.begin( ), carry+'0');
    }
    return res;
}
int main( )
{
    int n; 
    while( cin>>n)
        cout<<NPowerOf2(n)<<endl;
    return 0;
}
编辑于 2018-09-09 08:32:29 回复(2)
模拟两数相乘,考虑进位,就ok了
import java.util.Scanner;
public class Main {
    //对于一个整数N(512 <= N <= 1024),计算2的N次方并在屏幕显示十进制结果。
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        //输入一个整数N(512 <= N <= 1024)
        int n = input.nextInt();
        String number = "1";
        for(int i = 0; i < n; i ++){
            number = multiply(number);
        }
         //2的N次方的十进制结果
        System.out.println(number);
    }
    
    //调用方法求乘积
    public static String multiply(String str1){
        char[] char1 = str1.toCharArray();
        int[] int1 = new int[char1.length+1];
        for(int i = 0; i < char1.length; i ++){
            int1[i+1] = char1[i] - 48;
        }
        //首位为0
        int1[0] = 0;
        int jinwei = 0;
        int dangqian = 0;
        int mul = 1;
        //设置一个保留位,保留上位是否需要进位
        for(int i = int1.length-1; i >= 0; i --){
            //计算当前位的值
            //1、取出当前位
            dangqian = int1[i];
            //2、计算当前位与个数的乘积并加上低位的进位
            mul = dangqian * 2 + jinwei;
            //3、将乘积的个位数赋值作为当前位
            dangqian = mul%10;
            //4、将当前位的值赋给数组
            int1[i] = dangqian;
            
            //计算当前位的进位
            //1、将进位赋值为0
            jinwei = 0;
            //2、如果当前位的乘积有进位(大于10),则将其10位部分的值赋给进位
            if(mul/10 > 0){
                jinwei += mul/10;
            }
        }
        String back = "";
        int startIndex = -1;
        //循环结束后首位任然为0,则直接返回后位,否则连首位一起返回
        startIndex = (int1[0] == 0) ? 1 : 0;
        for(int i = startIndex; i < int1.length; i ++){
            back += int1[i];
        }
        return back;
    }
}
发表于 2018-09-11 17:15:55 回复(0)

Python3 一行

print(2 ** int(input()))

Golang解法:

使用math/big库

package main
import (
    "fmt"
    "math/big"
)
func main() {
    var (
        input int64
        i     *big.Int
        n     *big.Int
    )
    i = big.NewInt(2)
    fmt.Scan(&input)
    n = big.NewInt(input)  // 将输入的int64格式整数转为bigint类型
    i.Exp(i, n, nil) // 计算i的n次幂
    fmt.Println(i)
}
编辑于 2019-02-23 09:14:33 回复(0)
    System.out.println(BigInteger.ONE.shiftLeft((new Scanner(System.in)).nextInt()));
主要是懒
发表于 2018-11-01 08:41:20 回复(1)
惭愧惭愧,懒得debug了,这道题采用了如下最无耻的方法来做
print(2**int(input()))


发表于 2020-11-09 13:03:51 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            String ans = compute(n);
            System.out.println(ans);
        }
    }
    
    private static String compute(int n){
        String ans = "";
        if(n == 1) return "2";
        String temp = compute(n/2);
        if(n%2==0){
            ans =  multiply(temp, temp);
        }else{
            ans = multiply(multiply(temp, temp), "2");
        }
        return ans;
    }
    
    private static String multiply(String str1, String str2){
        int len1 = str1.length();
        int len2 = str2.length();
        int[] ans = new int[len1+len2];
        for(int i=len1-1; i>=0; i--){
            for(int j=len2-1; j>=0; j--){
                int mul = (str1.charAt(i)-'0')*(str2.charAt(j)-'0');
                int p1 = i+j, p2 = i+j+1;
                int sum = mul+ans[p2];
                ans[p1] += sum/10;
                ans[p2] = sum%10;
            }
        }
        StringBuffer res = new StringBuffer();
        for(int value:ans) 
            if(!(res.length() == 0 && value == 0))
                res.append(value);
        return (res.length() == 0)? "0": res.toString();
    }
}

发表于 2020-04-03 15:04:11 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string res="1";
    for(int i=0;i<n;i++)
    {
        int carry = 0, multi= 0;
        for(int j=res.size()-1;j>=0;j--)
        {
            int tmpNum = res[j] - '0';
            multi= (tmpNum<<1) + carry;
            carry = multi/10; 
            res[ j] = (multi%10) + '0';
        }
        if( carry> 0)
            res.insert(res.begin( ), carry+'0');
    }
    cout<<res<<endl;
    return 0;
}

发表于 2019-06-24 22:44:05 回复(0)
import java.util.Scanner;

public class Main {
    public static void main( String[] args ) {
        Scanner sc = new Scanner( System.in );
        while( sc.hasNextInt() ) {
            int n = sc.nextInt();
            StringBuilder res = new StringBuilder( "1" );
            for( int i = 1; i <= n; i ++ ) {
                int len = res.length();                 int tmp = 0;
                for( int j = len-1; j >= 0; j -- ) {
                    tmp = ( ( res.charAt(j)-'0' ) << 1 ) + tmp/10;
                    res.setCharAt( j, (char)(tmp%10+'0') );
                }
                if( tmp/10 == 1 ) res.insert( 0, '1' );
            }
            System.out.println( res );
        }
    }
}

发表于 2019-01-14 12:32:14 回复(0)
#include <iostream> #include <cstring> using namespace std;
int main() {  int n;  cin >> n;  string s = "1";  for (int i = 0; i<n; ++i)  {   int carry = 0;   int size = s.size();   for (int j=0;j<size; ++j)   {    int temp=s[j]-'0';    temp *= 2;    temp += carry;    carry = temp / 10;    s[j]=temp%10+'0';    if (carry>0&&j==s.size()-1)    {     s.insert(s.end(), carry + '0');     carry = 0;    }      }         }  for (int k=s.size()-1;k>=0;k--)  {   cout << s[k];  }    return 0; }

发表于 2018-10-02 14:35:55 回复(0)
用string来存储
#include <iostream>
#include <stdio.h>
usingnamespacestd;
 
intmain() {
    intn = 0;
    cin >> n;
    string s("1");
    intcarry = 0;
    for(inti=0; i<n; i++) {
        for(intj=s.size()-1; j>=0; j--) { //从后向前*2
            inttmp = s[j] - '0';
            tmp *= 2;
            tmp += carry;
            if(tmp >= 10) {
                carry = tmp/10; // 进位
                tmp = tmp%10;
                s[j] = tmp + '0';
                if(j == 0) {
                    // 需要额外开个空间,比如512*2
                    charc[2];
                    sprintf(c, "%d", carry);
                    s.insert(0, c);
                    carry = 0;
                }  
            } else{
                s[j] = tmp + '0';
                carry = 0;
            }  
        }  
    }  
    cout << s << endl;
    return0;
}

发表于 2018-09-21 17:26:31 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        int n = 0, temp = 0;
        Scanner sc = new Scanner(System.in);
        Boolean carry = false;//进位
        list.add(1);//初始值为1
        n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            for (int j = list.size() - 1; j >= 0; j--) {//从后往前计算
                temp = list.get(j);
                list.set(j, (temp * 2) % 10);//每一位乘以2
                if (carry)//有进位的需要加一
                    list.set(j, (temp * 2) % 10 + 1);
                if (temp < 5)//小于5的乘以2不需要进位为false
                    carry = false;
                else if (j == 0) {//首位且大于5的
                    list.add(0, 1);//需进位,在开头插入1
                    carry = false;//插入1已进位需设为false
                } else//非首位且大于5的需要进位为true
                    carry = true;
            }
        }
        for (int i : list)
            System.out.print(i);
    }
} 
发表于 2018-11-01 00:11:30 回复(0)
N = int(input()) print(2**N)

编辑于 2018-09-12 16:34:48 回复(1)
#include <iostream> #include <cmath> int main() { int N; std::cout << "请输入一个整数N(512 <= N <= 1024):"; std::cin >> N; if (N >= 512 && N <= 1024) { double result = std::pow(2, N); std::cout << "2的" << N << "次方的十进制结果为:" << result << std::endl; } else { std::cout << "输入的N不符合要求,请重新输入。" << std::endl; } return 0; } </cmath></iostream>
发表于 2024-10-25 11:16:22 回复(0)

//这题的是求幂运算,为了加快幂运算,使用快速幂思想; 此外,为了应对大数据,使用大数相乘的模板;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
       
        System.out.println(fastPow(2,n));


    }
    // 快速幂
    public static String fastPow(int x,int y){
        String base = String.valueOf(x);
        String res = "1";
        while(y!=0){
            if((y&1)==1){
                res = bigMultiple(res,base);
            }
            base = bigMultiple(base,base);
            y = y>>1;
        }
        return res;
    }
    //大数相乘
    public static String bigMultiple(String str1,String str2){
        int[] arr = new int[str1.length()+str2.length()];
        for(int i=0;i<str1.length();i++){
            for(int j=0;j<str2.length();j++){
                int x = str1.charAt(i)-'0';
                int y = str2.charAt(j)-'0';
                arr[i+j+1] += x*y;
            }
        }
        int pre = 0;
        for(int i=arr.length-1; i>=0; i--){
            int temp = (arr[i]+pre)%10;
            pre = (arr[i]+pre)/10;
            arr[i] = temp;
        }
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<arr.length;i++){
            if(i==0&&arr[i]==0) continue;
            sb.append(arr[i]);
        }
        return sb.toString();
    }

   


}
发表于 2024-09-11 20:22:54 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main(){
    int n;
    cin>>n;
    string s("13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096");
    int flag=0; //进位标志
	for(int i=0;i<n-512;i++){
		for(int j=s.length()-1;j>=0;j--){
			int num=((s[j]-'0')<<1)+flag;
			flag=num/10;
			s[j]=num%10+'0';
		}    
		if(flag>0) {
			s.insert(s.begin(),flag+'0');
			flag=0;
		}	
    	
	}
	cout<<s<<endl;
}


发表于 2022-09-10 23:29:32 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(NPowerOf2(n));
    }
    
    static String NPowerOf2(int n) {
        StringBuilder res = new StringBuilder("1");
        for (int i = 0; i < n; i++) {
            int carry = 0;//进位
            int multi = 0;
            for (int j = res.length() - 1; j >= 0; j--) {
                int temp = res.charAt(j) - '0';
                multi = (temp << 1) + carry;
                carry = multi / 10;
                res.setCharAt(j, (char) ((multi % 10) + '0'));
            }
            if (carry > 0){
                res.insert(0,(char)(carry+'0'));
            }
        }
        return res.toString();
    }
}

发表于 2021-03-20 01:37:05 回复(0)
importrandom
a =random.randint(512,1024)
print(2**a)
发表于 2019-10-21 17:09:30 回复(0)
用一个数组保存数据
#include<bits/stdc++.h>
using namespace std;
int main(){
    int N;
    cin >>N;
    vector<int>res(1000,0);//数组长度10000
    res[0]=1;//第一位置1,2的0次方为1
    int i,j,k;
    for(i=0;i<N;++i)//求2的N次方,循环N次
    {
        for(j=0;j<1000;++j) 
        {
            res[j]*=2;//vector中的每一位都*2
        }
        for(k=0;k<1000;k++)
        {
            if(res[k]>9)
            {
                res[k+1]++;//检查是否有进位 进位它的下一位+1
                res[k]=res[k]%10;//本位对10 取余
            }
        }
    }
    i=1000;
    while(res[i]==0) i--;//倒序打印
    for(;i>=0;i--)
        cout << res[i];
}


发表于 2019-08-22 11:28:51 回复(0)
#模拟2*2*2*...* 就可以了
n=int(input())
s=[1]
for i in range(n):
    t=0
    for j in range(len(s)-1,-1,-1):
        count=s[j]*2
        r=(count+t)%10
        t=(count+t)//10
        s[j]=r
    if t>0:
        s.insert(0,t)
print(''.join(str(s[i]) for i in range(len(s))))

发表于 2019-06-21 11:27:23 回复(0)
#include<vector>
#include<iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    int tmp=0;
    vector<int> string;
    string.push_back(1);
    for(int k=0;k<N;k++){
       if(string[string.size()-1]>=5){
            string.push_back(0);}
        for(int z=0;z<string.size();z++){
            //if(string[z]!=0)
            
            string[z]=2*string[z]+tmp;
            tmp=string[z]/10;
            string[z]=string[z]%10;
        }

        
    }
    for(int show=string.size()-1;show>=0;show--){
        cout<<string[show];
    }
}

农民代码,C C++傻傻分不清楚。
发表于 2019-04-18 21:30:04 回复(0)