首页 > 试题广场 >

幂运算

[编程题]幂运算
  • 热度指数:5099 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
给定两个数R和n,输出R的n次方,其中0.0<R<99.999, 0<n<=25

输入描述:
多组测试用例,请参考例题的输入处理 输入每行一个浮点数 R 其中0.0 < R <99.999, 一个整数 n 其中0 < n <=25


输出描述:
输出R的n次方
示例1

输入

95.123 12 0.1 1

输出

548815620517731830194541.899025343415715973535967221869852721 0.1
import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String r;
        int n;
        String s;
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            r = sc.next(); //用string来存储,因为double和float都是不能准确的表示小数的,只是以概数来表示
            n = sc.nextInt();
            BigDecimal d = new BigDecimal(r);
            BigDecimal ans = new BigDecimal(r);
            for(int i=1;i<n;i++){
                ans = ans.multiply(d);
            }
            s= ans.stripTrailingZeros().toPlainString(); // 去除不必要的零,转换为字符串,防止科学记数法
            System.out.println(s);
        }

    }
}
发表于 2018-08-20 22:24:43 回复(4)
Python3-------24ms----------3400K
###python3#####
###把浮点型转化为整数(比如95.123转化为95123 ),再做n次方运算95123**12
###计算最后小数点的位置.123 小数有3位 12次方后 那就是3*12=16位
###由于最后得到的整数长度可能会小于小数点需要移动的长度所以要加个补零操作
###最后由于一开始没对a的末尾进行去0,所以最后进行去0操作
if __name__=='__main__':
    while 1:
        try:
            a,b=input().split()
            index=a.find('.')
            #把浮点转整数
            aint=int(a[:index]+a[index+1:])
            b=int(b)
            ###计算最后小数点的位置
            zeros=(len(a)-index-1)*b
            orint=str(aint**b)
            j=len(orint)
            #补零
            if j<=zeros: orint='0'*(zeros+1-j)+orint
            c=len(orint)-zeros
            #去0操作
            print(orint[:c]+'.'+str(int(orint[c:][::-1]))[::-1])
        except:
            break

发表于 2019-03-23 15:58:25 回复(1)
#include<iostream>
#include<string>
#include<vector>

using namespace std;

string Bignum(string rf,string lf)
{
    int lfs=lf.size();
    int rfs=rf.size();
    int lfint,rfint;
    vector<int> resint(lfs+rfs,0);
    for(int i=lfs-1;i>=0;i--)
    {
        lfint=lf[i]-'0';
        for(int j=rfs-1;j>=0;j--)
        {
            rfint=rf[j]-'0';
            resint[i+j+1]+=lfint*rfint;
        }
    
    }
    string result;
    char str;
    for(int k=resint.size()-1;k!=0;k--)
    {
        while(resint[k]>=10)
        {
            resint[k]-=10;
            resint[k-1]+=1;
        }
    }
    for(int k=0;k!=resint.size();k++)
    {
        if(k==0 && resint[k]==0)
        {
            continue;
        }
        str='0'+resint[k];
        result.push_back(str);
    }

    return result;
}


int main()
{
    string R;
    int T;
    while(cin>>R>>T)
    {
        string str,res;
        int i,count=0,pointpos=-1,respointpos;
        for(i=0;i!=R.size();i++)
        {
            if(R[i]!='.')
            {
                str.push_back(R[i]);        
            }
            else
                pointpos=i;
        }
        res=str;
        for(i=0;i<T-1;i++)
        {
            res=Bignum(res,str);
        }
        if(pointpos!=-1)
        {
            respointpos=(str.size()-pointpos)*T;
            res.push_back('0');
            
            for(i=res.size()-1;count!=respointpos;i--)
            {
                res[i]=res[i-1];
                count++;
            }
            res[i]='.';
            for(i=res.size()-1;i>=0;i--)
            {
                if(res[i]=='0')
                {
                    res.pop_back();
                }
                else
                    break;
            }
        }
        cout<<res<<endl;
    }

    return 0;
}
发表于 2018-09-06 19:51:43 回复(0)
string bigNbrMuti(string lf, string rh)
{
    int lfSize = lf.size();
    int rhSize = rh.size();
    vector<int> posRcrd(lfSize + rhSize,0);

    for (int rhPos = rhSize-1; rhPos >=0 ; rhPos--)
    {
        int rhPosVal = rh[rhPos] - '0';
        for (int lfPos = lfSize-1; lfPos >=0; lfPos--)
        {
            int lfPosVal = lf[lfPos]-'0';
            posRcrd[rhPos + lfPos+1] += lfPosVal*rhPosVal;
        }
        for (int i = lfSize + rhSize - 1; i >=1 ; i--)
        {
            while (posRcrd[i] >= 10)
            {
                posRcrd[i] -= 10;
                posRcrd[i - 1] += 1;
            }
        }
    }
    string reslut;
    for (int i = 0; i < lfSize + rhSize; i++)
    {
        if (0 == i && 0 == posRcrd[i])
        {
            continue;
        }            
        reslut.push_back('0' + (char)(posRcrd[i]));

    }
    return reslut;
}
void test(void)
{
    string r;
    int n;
    while (cin >> r >> n)
    {
        string intNbr;
        int posOfPoint = -1;
        //祛除小数点后得到一个整数并记录小数点的位置
        for (int i = 0; i < r.size(); i++)
        {
            if (r[i] != '.')
            {
                intNbr.push_back(r[i]);
            }
            else
            {
                posOfPoint = i;
            }
        }
        int validSize = intNbr.size();
        //去除123.100这种情况后面的0,获得有效位的大小
        if (posOfPoint != -1)
        {
            for (int i = r.size() - 1; i >= 0; i--)
            {
                if (r[i] == '0')
                {
                    intNbr.pop_back();
                    validSize--;
                }
                else
                {
                    break;
                }
            }
        }
        string result = intNbr;
        //大数乘法
        for (int i = 0; i < n - 1; i++)
        {
            result = bigNbrMuti(result, intNbr);
        }
        //计算小数点的位置
        if (posOfPoint != -1)
        {
            int nbrOfFrac = validSize - posOfPoint;
            int posOfPointInResult = nbrOfFrac*n;
            result.push_back('0');
            int count = 0;
            int i;
            for (i = result.size() - 1; count != posOfPointInResult; i--)
            {
                result[i] = result[i - 1];
                count++;
            }
            result[i] = '.';
        }
        cout << result << endl;
    }

```
}

编辑于 2018-08-26 21:46:00 回复(0)
用Java输入第一个数的时候,最好用字符串去表示
发表于 2019-03-01 11:04:49 回复(0)
#include <iostream>
#include <string>
#include <array>
#include <sstream>

using namespace std;

string* BigMultipy(const string &a, const string &b) {
    size_t len_a = a.size();
    size_t len_b = b.size();

    string *str = new string(len_a + len_b, '0');

    int i, j, tmp = 0;

    for (i = len_a - 1; i >= 0; --i) {
        for (j = len_b - 1; j >= 0; --j) {
            tmp = (a[i] - '0')*(b[j] - '0') + ((*str)[i + j + 1]-'0');
            (*str)[i + j + 1] = tmp % 10 + '0';
            tmp /= 10;
            (*str)[i + j ] = (((*str)[i + j] -'0') + tmp) + '0';
        }
    }
    if (str[0][0] == '0')
        str->erase(0, 1);
    return str;
}


void power(double r, int n) {
    
    stringstream ss;
    string str;
    ss << r;
    str = ss.str();

    string::size_type idx = str.find(".");
    int dot_num = str.size() - str.find(".") - 1;
    str.erase(idx, 1);

    string res = string("1");

    for (int i = 0; i < n; ++i) {
        res = *BigMultipy(res, str);
    }
    int len = res.size();
    int idx_ = len - dot_num * n;
    res.insert(idx_, ".");
    cout << res << endl;
}

int main()
{
    double a;
    int b;
    cin >> a >> b;
    power(a, b);
    system("pause");
    return 0;

}

发表于 2018-09-06 21:26:06 回复(1)

人生苦短,我用Python

import re
def float_format(result_int, decimal_number):
    result_str = str(result_int)
    if len(result_str) <= decimal_number:
        result = '%0{}d'.format(decimal_number) %result_int
        result = '0.' + result
    else:
        left_result = result_str[:-decimal_number]
        right_result = result_str[-decimal_number:]
        result = '.'.join([left_result, right_result])
    return result.rstrip('0').rstrip('.')

a = input()
row_list = a.split('\n')
for row in row_list:
    a = re.split('\s+', row)[0]
    b = re.split('\s+', row)[1]
    str_len = len(a)
    point_pos = a.find('.')
    decimal_number = str_len - 1 -point_pos
    a_int = int(a.replace('.', ''))
    b_int = int(b)
    result_int = a_int ** b_int
    result = float_format(result_int, decimal_number * int(b))
    print(result)
编辑于 2018-08-31 14:57:47 回复(1)
进行n次R的大数乘法即可,笔试的时候为了赶时间AC,干脆就用BigDecimal吧,面试的时候还是得手写一个浮点数的大数乘法。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str = br.readLine()) != null){
            if(str.equals("")) continue;
            String[] params = str.split(" ");
            StringBuilder res = new StringBuilder();
            for(int i = 0; i < params.length; i += 2){
                String R = params[i];
                if(params[i + 1].equals("")) i++;
                int n = Integer.parseInt(params[i + 1]);
                res.append(power(R, n)).append(" ");
            }
            System.out.println(res.toString().trim());
        }
    }
    
    // 计算乘方
    private static String power(String R, int n) {
        String res = "1";
        for(int i = 0; i < n; i++)
            res = multiply(R, res);
        return res;
    }
    
    // 计算乘法
    private static String multiply(String num1, String num2) {
        BigDecimal float1 = new BigDecimal(num1);
        BigDecimal float2 = new BigDecimal(num2);
        // 去掉后面的0,并取消科学计数法
        return float1.multiply(float2).stripTrailingZeros().toPlainString();
    }
}


发表于 2021-02-24 11:55:24 回复(0)
想问一下大佬们,python3,为啥我这个提交不通过呢?本地没问题
class Solution:
    def solve(self,s):
        s1 = s.split(' ')
        if len(s1) % 2 != 0:
            print('length is wrong')
        else:
            count = 0
            se = []
            for i in range(len(s1)):
                se.append(s1[i])
                count += 1
                if count == 2:
                    result = float(se[i-1]) ** float(se[i])
                    count = 0
                    print(result,end=" ")


s = input()
Solution().solve(s)

发表于 2021-10-29 14:07:33 回复(0)
运行 12ms
import java.io.IOException;
import java.math.BigDecimal;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] tmp = br.readLine().split(" ");
        if (tmp.length > 3){
            int b = Integer.parseInt(tmp[1]);
            int d = Integer.parseInt(tmp[3]);
            BigDecimal a = new BigDecimal(tmp[0]);
            BigDecimal c = new BigDecimal(tmp[2]);
            BigDecimal num1 = a;
            BigDecimal num2 = c;
            for (int x = 1; x < b; x++) {
                num1 = num1.multiply(a);
            }
            for (int x = 1; x < d; x++) {
                num2 = num2.multiply(c);
            }
            System.out.println(num1 + " " + num2);
        }
    }
}


编辑于 2021-05-23 22:32:03 回复(0)
data = list(map(str, input().split()))
data_int = [0, 0]
data_float = [0, 0]     # 没有小数位数
for i0 in range(len(data[0])):
    if data[0][i0] == '.':
        data_float[0] = len(data[0]) - 1 - i0  # 小数位数
        data_int0 = data[0].split('.')
        data_int[0] = int(data_int0[0] + data_int0[1])  # 转换为整数
        break
if data_float[0] == 0:
    data_int[0] = int(data[0])  # 转换为整数
data[0] = data_int[0]
data[1] = int(data[1])

def power_a(r, n):
    re = 1
    for i0 in range(int(n)):
        re *= r
    return re
t0 = power_a(data[0], data[1])
# print(len(str(t0)))
if (data_float[0] * data[1]) == 0:
    t01 = int(t0)
    t0 = t01
elif (data_float[0] * data[1]) >= len(str(t0)):
    t02 = '0'  # 考虑小数位太多,要在前面加0
    for i1 in range(data_float[0] * data[1] - len(str(t0))):
        t02 += '0'
    t02 += str(t0)
    t01 = '0' + '.' + t02[1:]
    t0 = float(t01)
else:
    t01 = str(t0)[:-(data_float[0] * data[1])] + '.' + str(t0)[-(data_float[0] * data[1]):]
    t0 = float(t01)
    
print(t01)  # 示例给的是一行四个数,测试缺失一行2个数,Python保留>16位小数要用其他模块
# for j0 in range(len(data[2])):
#     if data[2][j0] == '.':
#         data_float[1] = len(data[2]) - 1 - j0  # 小数位数
#         data_int0 = data[2].split('.')
#         data_int[1] = int(data_int0[0] + data_int0[1])  # 转换为整数
#         break
# if data_float[1] == 0:
#     data_int[1] = int(data[2])  # 转换为整数
# data[2] = data_int[1]
# data[3] = int(data[3])

# t1 = power_a(data[2], data[3])
# if (data_float[1] * data[3]) == 0:
#     t11 = int(t1)
#     t1 = t11
# elif (data_float[1] * data[3]) >= len(str(t1)):
#     t12 = '0'  # 考虑小数位太多,要在前面加0
#     for i1 in range(data_float[1] * data[3] - len(str(t1))):
#         t12 += '0'
#     t12 += str(t1)
#     t11 = '0' + '.' + t12[1:]
#     t1 = float(t11)
# else:
#     t11 = str(t1)[:-(data_float[1] * data[3])] + '.' + str(t1)[-(data_float[1] * data[3]):]
#     t1 = float(t11)

# print(t01, t11)
编辑于 2021-05-04 15:58:28 回复(0)
#include <iostream>
#include <vector>
#include <string>

using namespace std;

string getTheMultiString(string& res, string& str)
{
    int len1 = str.size(), len2 = res.size();
    string ret(len1 + len2, '0');
    for(int i = len2 - 1; i >= 0; --i)
    {
        for(int j = len1 - 1; j >= 0; --j)
        {
            int tmp = ret[i + j + 1] - '0' + (str[j] - '0') * (res[i] - '0');
            ret[i + j + 1] = tmp % 10 + '0';
            ret[i + j] += tmp / 10;
        }
    }
    
    for(int i = 0; i < ret.size(); ++i)
    {
        if(ret[i]!= '0')
            return ret.substr(i);
    }
    
    return "0";
}
int main()
{
    string str;
    int n = 0;
    while(cin >> str >> n)
    {
        auto index = str.find('.');
        if(index != string::npos)
            str.erase(str.begin() + index, str.begin() + index + 1);
        string res = str;
        for(int i = 0; i < n - 1; ++i)
            res = getTheMultiString(res, str);
        
        if(index != string::npos)
        {
            int retindex = (str.size() - index) * n;
            while(n >= res.size())
                res.insert(res.begin(), '0');
                
            res.insert(res.end() - retindex, '.');
            auto zero = res.find_last_not_of('0');
            if(zero != string::npos)
                res.erase(res.begin() + zero + 1, res.end());
        }
        
        cout << res << endl;
    }
    
    return 0;
}

为什么一直是83.333%显示段错误
求大神解答
发表于 2020-07-27 21:59:23 回复(0)
public class Main { public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);  String str = scan.nextLine();  String[] strings = str.split(" ");  if(strings.length%2 != 0){
            System.out.println("输入错误");  }else{ for(int i = 1 ;i<strings.length;i+=2){
                BigDecimal b = new BigDecimal(strings[i-1]);  System.out.println(b.pow(Integer.parseInt(strings[i])));  }
        }
    }
}
发表于 2019-07-24 16:55:01 回复(0)
import java.util.*;
public class Main{
  public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            //用Double处理后面的0,才能计算正确的小数点位置
            String s=Double.valueOf(sc.next()).toString();
            int n=sc.nextInt();
            int l=s.length();
            int t=s.indexOf('.');
            //最后小数点位置
            int index=(l-t-1)*n;
            String ss=s.substring(0,t)+s.substring(t+1);
            String res=ss;
            for(int i=1;i<n;i++){
                res=Multiply(res,ss);
            }
            StringBuilder sb=new StringBuilder();
            for(int i=res.length()-1;i>=0;i--){
                if(index==0){
                    sb.append('.');
                }
                sb.append(res.charAt(i));
                index--;
            }
            //输入的数比1小时
            while(index>=0){
                if(index==0){
                    sb.append(".0");
                }else{
                    sb.append('0');
                }
                index--;
            }
            System.out.println(sb.reverse());
        }
    }
    
    //大数相乘
    private static String Multiply(String num1,String num2){
        int l=num1.length();
        int n=num2.length();
        //长度位m的数乘以长度为n的数的结果不超过m+n
        int[] pos=new int[l+n];
        for(int i=l-1;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                int temp=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
                //对于num[i] *num[j](数1中的第i位数字与数2中的第j位数字相乘的结果
                //只会存放在第[i+j]和[i+j+1]这两位上
                int p1=i+j;
                int p2=i+j+1;
                int sum=temp+pos[p2];
                //p1为进位
                pos[p1]+=sum/10;
                pos[p2]=sum%10;
            }
        }
        StringBuffer sb =new StringBuffer();
        for(int p:pos){
            if(!(sb.length()==0&&p==0)){
                sb.append(p);
            }
        }
        return sb.toString();
    }
}

发表于 2019-07-02 22:47:33 回复(0)
#大数相乘
def jinWei(a,b):
    v=a+b
    if v>9:
        return [v-10,1]
    else:
        return [v,0]

def jinWei2(res,k,x):
    v=res[k+x]+1
    if v>9:
        res[k+x]=0
        jinWei2(res,k,x-1)
    else:
        res[k+x]=v

def listToStr(a):
    sss=''
    for y in range(len(a)):
        sss+=str(a[y])
    return sss

s=list(input().split())
rr=[]
for i in range(0,len(s),2):
    r=s[i]
    n=int(s[i+1])
    if n==0:
        rr.append('1')
    elif n==1:
        rr.append(r)
    else:
        idx=r.index('.')
        count=(len(r)-idx-1)*n
        m=int(r[:idx]+r[idx+1:])
        m=str(m)
        m1 = m
        result=[]
        for j in range(1,n):
            p = len(m)+len(m1)
            res=[0]*p
            for k in range(len(m)-1,-1,-1):
                for x in range(len(m1)-1,-1,-1):
                    c=int(m[k])*int(m1[x])
                    c1=c//10
                    c2=c%10
                    val=jinWei(res[k+x+1],c2)
                    res[k+x+1]=val[0]
                    if val[1]==1:
                        jinWei2(res,k,x)
                    val1=jinWei(res[k+x],c1)
                    res[k+x]=val1[0]
                    if val1[1]==1:
                        jinWei2(res,k,x-1)
            if res[0]==0:
                res=res[1:]
            m1=listToStr(res)
            result=res[:]
        length=len(result)
        if length<count:
            for j in range(count-length):
                result.insert(0,0)
            result.insert(0,'0.')
            rr.append(listToStr(result).rstrip('0'))
        else:
            result.insert(length-count,'.')
            ss=listToStr(result).rstrip('0')
            if ss[len(ss)-1]=='.':
                rr.append(ss[:len(ss)-2])
            else:
                rr.append(ss)
print(' '.join(rr[i] for i in range(len(rr))))



发表于 2019-06-22 16:12:11 回复(0)
一直66.7%超时什么情况啊
发表于 2019-06-18 14:28:57 回复(0)
public class Main {
    public static void main(String[] args) throws IOException {
         //使用了BigDecimal来记录大浮点数,代码看起来比较简洁
        Scanner sc = new Scanner(System.in);
        BigDecimal bString = new BigDecimal(sc.next());
        int i = sc.nextInt();
        BigDecimal multiply = bString;
        for (int j = 1; j < i; j++) {
            multiply = multiply.multiply(bString);
        }
        System.out.println(multiply.stripTrailingZeros().toPlainString());
    }
}

发表于 2019-04-09 14:23:29 回复(0)
import java.math.BigDecimal;
import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      try(Scanner in = new Scanner(System.in)) {
         while(in.hasNext()) {
            System.out.println(new BigDecimal(in.next()).pow(in.nextInt()).stripTrailingZeros().toPlainString());
         }
      }
   }
}

发表于 2019-01-18 14:06:02 回复(0)
package P1001;

import java.math.BigDecimal;

public class Mys {
    
    public static Double   mys( Double a,Integer b){
        
        
         if (b==1){
             return a;
         }else{
             
             
             return a*mys(a,b-1);
         }
         

        
    }
    public static void main(String[] args) {
        Double mys = mys(95.123,12);
        
        String str=new BigDecimal(mys).toString();
        System.out.println( str);
        
    }
    
}

发表于 2018-10-23 18:38:19 回复(0)
public class Main {


    public static List<Object> objects = new ArrayList<>();

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.err.println("请输入数据,例如: 12.12 2 。 第一个参数为浮点数,第二个参数为整数,中间用空格分隔");
        while(scanner.hasNext()){
            String inNumber = scanner.nextLine();
            if(!splitString(inNumber)){
                System.err.println("输入数据错误,请重新输入。");
                clearDataList();
                continue;
            }
            jsList();
            clearDataList();
        }
    }

    public static void clearDataList(){
        objects.clear();
    }

    public static void jsList(){

        for (int i = 0; i < objects.size(); i = i + 2) {
            Object obj1 = objects.get(i);
            Object obj2 = objects.get(i + 1);
            BigDecimal dd = new BigDecimal(0);
            BigDecimal ii = new BigDecimal(0);
            if( obj1 instanceof BigDecimal){
                dd = (BigDecimal)obj1;
            }
            if(obj2 instanceof BigDecimal){
                ii = (BigDecimal)obj2;
            }
            js(dd , ii );
        }
    }

    public static boolean splitString(String str){
        if(str == null || str.length() ==0)
            return false;
        str = str.replaceAll(" +" , " ");
        String[] strs = str.split(" ");

        if(strs.length > 0 && strs.length % 2 > 0){
            String[] newStrs = new String[strs.length + 1];
            System.arraycopy(strs , 0 , newStrs ,0, strs.length );
            newStrs[strs.length] = "1";
            strs = newStrs;
        }

        for (int i = 0; i < strs.length; i = i + 2) {
            if(strs[i] != null && !strs[i].isEmpty()){
                BigDecimal dd = new BigDecimal(strs[i]);
                if(dataValoatie(dd.doubleValue() , true))
                    objects.add(dd);
                else
                    return false;
            }
            if(strs[i + 1] != null && !strs[i + 1].isEmpty()){
                BigDecimal ii = new BigDecimal(strs[i + 1]);
                if(dataValoatie(ii.doubleValue() , false))
                    objects.add(ii);
                else
                    return false;
            }
        }
        return true;
    }

    public static void js(BigDecimal df , BigDecimal mf){
        System.out.println(df.pow(mf.intValue()).stripTrailingZeros().toPlainString());
    }

    /**
     * 数据验证
     * ff true R  false N
     * @param number
     * @param ff
     * @return
     */
    public static boolean  dataValoatie(double number , boolean ff){
        if(ff){
            if(number <= 0 || number >= 99.99)
                return false;
        }else{
            if(number <= 0 || number >= 25)
                return false;
        }
        return true;
    }
}
发表于 2018-10-16 13:33:21 回复(0)