poj1001

3.13 2019 poj 泛做

主要选择AC ratio 20% - 30%的题目在做

poj1001

  • 高精度幂
  • 先将小数当成整数,记录数点位置
  • 进行高精度乘法,还原小数点位置
  • 处理前导0,后导0,其实并不难
  • blog1,blog2
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
#define ll long long
#define name2str(name) (#name)
#define db(x) cout<<#x"=["<<(x)<<"]"<<endl
#define CL(a,b) memset(a,b,sizeof(a))
#define sf(a) scanf("%d",&a)
#define pr(a) printf("%d
",a)
#define rng(a) a.begin(),a.end()
#define pb push_back
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define fr0(i,m) for(int i=0;i<m;i++)
#define fr1(i,m) for(int i=1;i<=m;i++)
//author:fridayfang
//date:19 3月 13
const double esp=1e-8;
const int mod=1e9+7;
const double pi=acos(-1);
const int inf=0x3f3f3f3f;
const int maxn = 200 + 5;
const int maxm = 1e6+5;
char sa[maxn],sb[maxn],sc[maxn];
int num;
char a[maxn],b[maxn],c[maxn];

void mul(char* num1,char* num2){
    //a*b 要求a[0],b[0]是最低位
    int tmp[200];CL(tmp,0);
    int len1=strlen(num1),len2=strlen(num2);
    for(int i=0;i<len1;i++){
        for(int j=0;j<len2;j++){
            tmp[i+j]+=(num1[i]-'0')*(num2[j]-'0');
        }
    }
    int carry=0;
    for(int i=0;i<(len1+len2);i++){
        a[i]=((carry+tmp[i])%10)+'0';
        carry=(carry+tmp[i])/10;
    }
    if(a[len1+len2-1]=='0')a[len1+len2-1]='';
    else a[len1+len2]='';  

}
void rev(char* str){
    
    for(int i=0,j=strlen(str)-1;i<j;i++,j--){
        swap(str[i],str[j]);
    }
}

int main(){
    while(~scanf("%s %d",sa,&num)){
        CL(a,0),CL(b,0),CL(c,0);
        int lena=strlen(sa),pos=-1;
        int j=0;
        for(int i=0;i<lena;i++){
            if(sa[i]=='.'){pos=i;continue;}
            b[j]=a[j]=sa[i];
            j++;            
        }
        b[j]=a[j]='';
        rev(a),rev(b);
        //ok a;
        for(int i=0;i<num-1;i++){
            mul(a,b);//store in b;
            //printf("db %s %s
",a,b);
        }
        //
        //db(pos);
        if(pos==-1){
            rev(a);
            printf("%s
",a);
        }
        else{//浮点数
            pos=lena-pos-1;
            int tpos=num*pos;
            //db(tpos);
            int len=strlen(a);
            int t;
            char tmp[maxn];CL(tmp,0);int j=0;
            
            //db(begin);db(tpos);
            bool tag=true;
            for(int t=len;t>=tpos;t--){//加入浮点
                if(t==tpos) a[t]='.';
                else if(a[t-1]=='0'&&tag) a[t]='';//消除前导0
                else if(t>=1) {a[t]=a[t-1];tag=false;}
            }
            //消除后导0
            
            a[len+1]='';
            int begin=tpos;
            for(int i=0;i<tpos;i++){
                if(a[i]!='0'){begin=i;break;}
            }
            //db(begin);
            if(begin==tpos)begin++;
            for(int i=begin;i<=len;i++){
                tmp[j++]=a[i];
            }
            tmp[j]='';
            
            rev(tmp);
            
            printf("%s
",tmp);

        }
        
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/fridayfang/p/10568291.html