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

考慮一下下面的樣例應該可以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;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章