poj1001 解题报告

Description

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(R n),其中n 是整数并且 0 < n <= 25。

Input

T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。

Output

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12


Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

这道高精度计算题需要应用字符串,因为常规存储类型无法存储如此巨大的数据,只能将数字以字符串的方式存储与处理。
由于字符串无法直接相乘,需要将字符串数组中的每一位字符转化成整型(与’0’的差),再应用乘法法则(笔算乘法的方法)进行计算。

本题中需要注意的点:
1.先找到小数点的位置,纪录并去掉。
2.去掉无意义的0。
3.纪录小数点后有效位的位数。
4.每次计算中都要去除无意义的0。
5.计算最后结果中小数点的位置。
6.将小数点加入到计算结果中。
7.去掉最终结果中的无意义的0并输出。

这道模拟题思路上并不算难,但是需要注意的点较多,需要仔细分析输入输出的可能性,还算是比较容易通过的一道题。

代码:
#include
#include


int len;
int product[ 126 ] = { 0 };

void multiply( int a[], int n)
{
   
int i;
    int carry = 0
    for (i = 0 ; i < len ; i++)
    {
       
int temp = a[i]*n + carry;
        a[i] = temp %
10 ;
        carry = temp /
10 ;
    }
   
while (carry)
    {
        a[i++] = carry %
10 ;
        carry /=
10 ;
    }
   
len = i;
}

int main( int argc, char * argv[])
{
    int n; 
    char s[6]; 
    while ( scanf ( "%s %d" , s, &n) != EOF )
    {
       
int position= 0 , i= 0 , num= 0 , j= 0 ;
       
for (i= 0 ; i< strlen (s); i++)
        {
           
if (s[i] == '.' )
            {
                position = (strlen(s) - 1 - i) * n;
            }
           
else
            {
                num = num*10 + s[i] - 48
            }
        }
        
        product [ 0 ]= 1 ;
       
len = 1 ;
       
for (i = 0 ; i < n; i++)
        {
           
multiply ( product , num);
        }
        
        if (len <= position) 
        {
            printf("."); 
            for (i= 0 ; i len ; i++)
            {
                printf("0"); 
            }
           
            j =
0 ;
            
            for (i= len - 1 ; i>=j; i--)
            {
               
printf ( "%d" , product [i]);
            }
        }
       
else
        {
            j=
0 ;
            while (product[j]==0 && j
            {
                j++;
            }
           
for (i= len - 1 ; i>=j; i--)
            {
                if (i+1 == position) 
                {
                   
printf ( "." );
                }
               
printf ( "%d" , product [i]);
            }
        }
       
printf ( "\n" );
    }
}

你可能感兴趣的:(poj1001 解题报告)