POJ_1001

http://poj.org/problem?id=1001

大体思路为将底数转换为十进制整数,求幂,然后再转换回小数

Multiply()负责结果乘乘数

输出需要判断小数位数与尾数位数的关系

代码参考了https://www.cnblogs.com/jhldreams/p/3785315.html

/**************************测试用例***********************************************/ 
/*
    样本输入
    95.123 12
    0.4321 20
    5.1234 15
    6.7592  9
    98.999 10
    1.0100 12
    
    样本输出
    548815620517731830194541.899025343415715973535967221869852721
    .00000005148554641076956121994511276767154838481760200726351203835429763013462401
    43992025569.928573701266488041146654993318703707511666295476720493953024
    29448126.764121021618164430206909037173276672
    90429072743629540498.107596019456651774561044010001
    1.126825030131969720661201
*/
/**************************乘法函数***********************************************/ 
#include<stdio.h>
#include<string.h>
int Result[130],N;//Result存储十进制结果,N是结果的位数 
void Multiply(int sum){
    int i;
    for(i=0;i<N;i++){
        Result[i] *= sum;
    }
    for(i=0;i<N;i++){
        if(Result[i]>9){
            Result[i+1] += Result[i]/10;
            Result[i] %= 10;
        }
    }
    while(true){
        if(Result[i]<1){
            break;
        }
        N++;
        Result[i+1] += Result[i]/10;
        Result[i] %= 10;
        i++;
    }
}
/**************************输入*******************************************/ 
int main(){
    int n,i,j,k,temp,length,Icon,sum;//n是乘幂,Icon是小数点位置
    int p,q;//p是后置0个数,q是前置0个数 
    char A0[6]; 
    while(scanf("%s %d",A0,&n)==2){
        memset(Result,0,sizeof(Result));
        length = strlen(A0);
        sum = 0;//sum是化作十进制的数
        Icon = 0; 
        for(i=0;i<length;i++){
            if(A0[i]=='.'){
                Icon = (length-1-i)*n;
            }
            else{
                sum = sum*10+A0[i]-'0';
            }
        }
/*************************计算十进制结果************************************************/
        if(sum==0){
            printf("0\n");
            continue;
        }
        Result[0] = 1;
        N = 1;
        for(i=0;i<n;i++){
            Multiply(sum);
        }
//        printf("sum%d N%d\n",sum,N);
//        for(i=0;i<N;i++){
//            printf("%d",Result[i]);
//        }
//        printf("\n");
/***********************调整输出格式****************************************************/ 
        //N结果总位数,Icon小数点后位数
        p = 0;
        for(i=0;i<N;i++){
            if(Result[i]!=0){
                p = i;
                break;
            }    
        }
/********************以下注释部分用不着,十进制计算的时候已经考虑整数部分的非零情况了*********************/ 
//        q = N-1;
//        for(j=N-1;j>-1;j--){
//            if(Result[j]!=0){
//                q = j;
//                break;
//            }
//        }
/**********************************************************************************************************/
        if(Icon-p<1){
            for(i=N-1;i>Icon-1;i--){
                printf("%d",Result[i]);
            }
        }
        else      //有小数点
        {
            if(Icon>N){
                N = Icon;
            }
            for(i=N-1;i>Icon-1;i--)
                printf("%d",Result[i]);
            printf(".");
            for(;i>=p;i--)
                printf("%d",Result[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/stevenzrx/p/11657164.html