| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2464 人关注过本帖
标题:求高精度幂
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:20 回复次数:7 
求高精度幂
写的纠结

谁有么好方法。


Description

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

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中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

搜索更多相关主题的帖子: 计算 国债 小数点 
2012-03-19 21:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
自己写的代码 自己看了都纠结  能得到正确结果 但是提交ACM 是 WA?
程序代码:
#include <stdio.h>
#include <string.h>

int  fun(int a1[], int *n, int iLen)
{
    int i, j, len = iLen, len1 = iLen, k, l = 0, s;
    int a[ 1000 ] = { 0 };
    int b[ 1000 ] = { 0 };
    int c[ 1000 ] = { 0 };
    int d[ 1000 ] = { 0 };   
    int mul, m = *n;
   
    for( i = 0; i < iLen; i++ )
        b[ i ] = a[ i ] = a1[ i ];
    while ( m - 1 )
    {
           for ( i = 0; i < len; i++ )
           {
                k = i;
                for ( j = 0; j < len1; j++ )
                {
                    mul = a1[ i ] * a[ j ] ;    
                       if ( mul + c[ k ] + d[ k ] > 9 )
                       {
                          c[ k + 1 ] = ( mul + c[ k ] + d[ k ] ) / 10;             
                          d[ k ] = ( mul + c[ k ]  + d[ k ] ) % 10;
                       }
                       else
                       d[ k ] = mul + c[ k ] + d[ k ];
                       k++;
                }
                d[ k ] = c[ k ];      
                for ( j = 0; j <= k; j++ )
                    c[ j ] = 0;     
           }
            len1 = k + 1;  
            for (j = 0; j <= len1; j++)
            {
               a[j] = d[j];
                d[j] = 0;
            }
        m--;
    }
    i = len1;s = 0;
    while( a[i] == 0 ) i--;
    while( a[s] == 0 ) s++;
    len1 = i + 1;
    j = 0;
   for (i = s; i <= len1 ; i++)
       a1[j++] = a[i];
   return j ;
}

int main(void)
{
    char a[ 1001 ] = { 0 };
    int  b[ 1001 ];
    int  n, i = 0, j = 0, cLen, iLen, strlen;
    int first, tail, dot, dotsize;
    int length, k;

    while( scanf("%s %d", a, &n) != EOF )
    {
        for ( i = 1000; i >= 0; i--)
            b[ i ] = 0;
        i = 0;
        while( a[i] ) i++;
        cLen = i;
        i = 0;
        while( a[i] != '.' && a[ i ] ) i++;
        {
            if ( i == cLen ) dot = -1;
           else dot = i;
        }
        i = 0;
        while( a[i] == '0' || a[i] == '.' ) i++;
        first = i;
        i = cLen - 1;
        while( a[i] == '0' ) i--;
        tail = i;
        j = 0;
        for( i = tail; i >= first; i--)
            if( a[i] != '.')
            {
              b[j] = a[i] - '0';
              j++;
            }
            iLen = j;
        length = fun(b, &n, iLen) - 1;
        j = 0;
        for ( i = length - 1; i >= 0; i--)   
        {
          a[ j ] = b[ i ] + '0';
          j++;
        }
            length = j;
       dotsize = ( tail - dot ) * n;
       if ( dot != -1 )
       {
           if ( length > dotsize )
           {
               strlen = length;
               for ( i = length - 1; i >= length - dotsize; i--)
               a[ i + 1 ] = a[ i ];
               a[ i + 1 ] = '.';
           }
           else
           {
              strlen = k = dotsize;
              for( i = length - 1; i >= 0; i--)
                  a[ k-- ] = a[ i ];
              for ( i = k; i >= 1; i--)
                  a[ i ] = '0';
              a[ 0 ] = '.';            
           }
      
       }
       else
       {
           strlen = length - 1;
           j = 0;
           for ( i = length - 1; i >= 0; i--)   
        {
          a[ j ] = b[ i ] + '0';
          j++;
        }

       }
    for ( i = 0; i <= strlen; i++)
        putchar( a[i] );
        printf("\n");
    }

    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册



梅尚程荀
马谭杨奚







                                                       
2012-03-19 22:11
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
改了下 能AC了
程序代码:
#include <stdio.h>
#include <string.h>

int  fun(int a1[], int *n, int iLen)    // Multiplication of large numbers
{
    int i, j, len = iLen, len1 = iLen, k, l = 0, s;
    int a[ 128 ] = { 0 };
    int b[ 128 ] = { 0 };
    int c[ 128 ] = { 0 };
    int d[ 128 ] = { 0 };   
    int mul, m = *n;
   
    for( i = 0; i < iLen; i++ )
        b[ i ] = a[ i ] = a1[ i ];
    while ( m - 1 )
    {
           for ( i = 0; i < len; i++ )
           {
                k = i;
                for ( j = 0; j < len1; j++ )
                {
                    mul = a1[ i ] * a[ j ] ;    
                       if ( mul + c[ k ] + d[ k ] > 9 )
                       {
                          c[ k + 1 ] = ( mul + c[ k ] + d[ k ] ) / 10;             
                          d[ k ] = ( mul + c[ k ]  + d[ k ] ) % 10;
                       }
                       else
                       d[ k ] = mul + c[ k ] + d[ k ];
                       k++;
                }
                d[ k ] = c[ k ];      
                for ( j = 0; j <= k; j++ )
                    c[ j ] = 0;     
           }
            len1 = k + 1;  
            for (j = 0; j <= len1; j++)
            {
               a[j] = d[j];
                d[j] = 0;
            }
        m--;
    }
    i = len1;s = 0;
    while( a[i] == 0 ) i--;
    len1 = i + 1;
    j = 0;
   for (i = 0; i <= len1 ; i++)
       a1[j++] = a[i];
   j--;
   return j ;
}

int main(void)
{
    char a[ 128 ] = { 0 };
    int  b[ 128 ];
    int  n, i = 0, j = 0, cLen, iLen, strlen;
    int  first, tail, dot, dotsize;
    int  length, k;

    while( scanf("%s %d", a, &n) != EOF )
    {
        for ( i = 127; i >= 0; i--)
            b[ i ] = 0;

        i = 0;
        while( a[i] ) i++;  // string length
        cLen = i;

        i = 0;
        while( a[i] != '.' && a[ i ] ) i++;   // dot position
        {
            if ( i == cLen ) dot = -1;
           else dot = i;
        }

        i = 0;
        while( a[i] == '0' || a[i] == '.' ) i++;  // the first char that is
                                                  // not '0' and '.'
        first = i;

        i = dot + 1;
        while( a[i] == '0' && a[i])    //  the last number
            i++;
        if (i == cLen)
            tail = dot - 1;     // an integer  tail
        else
        {
            i = cLen - 1;
            while( a[i] == '0' ) i--;
            tail = i;          // an decimal tail
        }

        j = 0;
        for( i = tail; i >= first; i--)  // convert the char array to int array
            if( a[i] != '.')
            {
              b[j] = a[i] - '0';
              j++;
            }
            iLen = j;        // the length of int array

        length = fun(b, &n, iLen);   // call function
                                         // return the length of int number without '.'

        j = 0;
        for ( i = length - 1; i >= 0; i--)    // convert the int array to char array
        {
          a[ j ] = b[ i ] + '0';
          j++;
        }
            length = j;

       dotsize = ( tail - dot ) * n;       // location of the dot
       if (dotsize > 0)
       {
           if ( dot != -1 )
           {
               if ( length > dotsize )
               {
                   strlen = length;
                   for ( i = length - 1; i >= length - dotsize; i--)
                   a[ i + 1 ] = a[ i ];
                   a[ i + 1 ] = '.';
               }
               else
               {
                  strlen = k = dotsize;
                  for( i = length - 1; i >= 0; i--)
                      a[ k-- ] = a[ i ];
                  for ( i = k; i >= 1; i--)
                      a[ i ] = '0';
                  a[ 0 ] = '.';            
               }
          
           }
           else
           {
               strlen = length - 1;
               j = 0;
               for ( i = length - 1; i >= 0; i--)   
            {
              a[ j ] = b[ i ] + '0';
              j++;
            }

           }
       }
       else
       {
              strlen = length - 1;
               j = 0;
               for ( i = length - 1; i >= 0; i--)   
            {
              a[ j ] = b[ i ] + '0';
              j++;
            }
       }

    for ( i = 0; i <= strlen; i++)   // output the result
        putchar( a[i] );
        printf("\n");
    }

    return 0;
}

太冗长了……


[ 本帖最后由 有容就大 于 2012-3-20 12:21 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-03-20 11:56
C_戴忠意
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:575
专家分:1349
注 册:2011-10-21
收藏
得分:10 
这似乎是大数问题

编程之路定要走完……
2012-03-20 12:53
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 

梅尚程荀
马谭杨奚







                                                       
2012-03-20 21:22
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
http://

梅尚程荀
马谭杨奚







                                                       
2012-03-21 09:53
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:10 
北大的必做题  第一次做的高精度就是它

                                         
===========深入<----------------->浅出============
2012-03-21 10:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 7楼 laoyang103
老杨有什么好方法 发个学习下

梅尚程荀
马谭杨奚







                                                       
2012-03-21 10:41
快速回复:求高精度幂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027340 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved