首页 > 其他分享 >POJ 1001 Exponentiation 字符串乘法+快速求幂

POJ 1001 Exponentiation 字符串乘法+快速求幂

时间:2023-02-21 19:07:05浏览次数:47  
标签:string Exponentiation int qian ret hou POJ 1001 size

考虑一下下面的样例应该可以AC:

底数整数的情况
去掉最后后导零
没有小数部分时候不输出小数点

思路
先不考虑小数点
将数存入字符串a,b中
答案存入ret
ret的长度是a的长度和b的长度之和
a[i]和b[j]相乘的位置放在ret的i+j和i+j+1的位置
注意进位

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


#define debug(x) cout<<#x<<": "<<x<<endl;

string cheng(string a,string b){
    string ret(a.size()+b.size(),'0');
    for( int i=a.size()-1;i>=0; i-- ){
        for( int j=b.size()-1;j>=0;j-- ){
            int temp = (a[i]-'0')*(b[j]-'0') + ret[i+j+1]-'0';
            ret[i+j+1] = temp%10+'0' ;
            ret[i+j] += temp/10;
        }
    }
    return ret;
}

string quickPow( string a,int n ){
    string ret = "1";
    while( n>0 ){
        if( n&1 ){
            ret = cheng(ret,a);
        }
        n >>= 1;
        a = cheng(a,a);
    }
    return ret;

}

int main()
{
    string s="0.4321";
    int a=20;
    while( cin >> s >>a ){
        int pos = s.find('.');

        string qian = s.substr(0,pos);
        string hou = s.substr( pos+1 );
        if(pos==-1){
            hou = "";
        }
        string ret = quickPow(qian+hou,a);
        int i = 0;
        int houSize = hou.size()*a;
        qian = ret.substr(0,ret.size()-houSize);
        hou = ret.substr(ret.size()-houSize);
        while( i < qian.size() && qian[i] == '0' ){
            i ++;
        }
        qian = qian.substr(i);
        i = hou.size()-1;
        while(i>=0 && hou[i]=='0'){
            i--;
        }
        hou = hou.substr(0,i+1);
        if(hou.size()==0){
            cout<< qian << endl;
        }else{
            cout<< qian <<"."<< hou <<endl;
        }

    }
    return 0;
}

POJ 1001 	Exponentiation 字符串乘法+快速求幂_ios

标签:string,Exponentiation,int,qian,ret,hou,POJ,1001,size
From: https://blog.51cto.com/liyunhao/6077012

相关文章

  • POJ 1050 To the Max 矩阵最大和的子数组:动态规划
    将原来的矩阵直接改造成dp矩阵dp[i][j]表示以以a[0][0]为左上角a[i][j]为右下角的矩阵之和所以一个O(n......
  • POJ 1088 滑雪 递归+dp | 拓扑排序
    从每个点(i,j)向四个方向去看如果某一个方向(a,b)的数值比当前位置小先求解(a,b)的最长距离,之后加1即可朴素的递归重复求解了很多子问题,我们每计算出一个子问题的解,便......
  • POJ 1636 Prison rearrangement 二部图连通分量+背包
    以第三组为例,我们根据输入可以得到这个二部图根据不能放在一起的情况可以得到这样的连通分量对于每一个连通分量,我们将这个连通分量按照监狱分为两个部分这两个部分调整的......
  • POJ 2228 Naptime 环形DP
    先不考虑环的情况dp[i][j][0]:前i个时间间隔中,已经花费了j个间隔,取得的最大值,并且第i个间隔在休息dp[i][j][1]:前i个时间间隔中,已经花费了j个间隔,取得的最大值,并且第i个间......
  • PAT Basic 1001. 害死人不偿命的(3n+1)猜想
    PATBasic1001.害死人不偿命的(3n+1)猜想0.写在前面:好久没更新了,是真的老厚积薄发(tuoyanzheng)了,另外确实也在忙课题的事情(虽然也没啥进展...这是件upsetting的......
  • C1001 游戏题解
    题目描述\(everlasting\)觉得太无聊了,于是决定和蒟蒻\(yyc\)玩游戏!他们会玩\(T\)轮游戏,每轮游戏中有若干局,他们的初始积分为\(1\),每局的分值为\(k\),输的人的得分......
  • [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
    题目vjudgeURL:​​CountingDivisors(square)​​​Letbethenumberofpositivedivisorsof.Forexample,,and.LetGiven,find.InputFirstlinecontains......
  • POJ 3345 Bribing FIPA
      #include<iostream>#include<map>#include<algorithm>#include<cstring>usingnamespacestd;constintN=203,M=N;typedeflonglongll;intn......
  • poj 2230
    求一个无向图的欧拉回路,但要求每条边正反过一次 当作有向图,打标记只打一条边 #include<iostream>#include<algorithm>#include<cstring>#include<stack>usi......
  • PAT 甲级 1001 A+B Format
    Calculate a+b andoutputthesuminstandardformat--thatis,thedigitsmustbeseparatedintogroupsofthreebycommas(unlesstherearelessthanfour......