作者:Leon916 来源:C++博客   酷勤网收集 2008-05-23

摘要
  对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n

求高精度幂
Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 33587   Accepted: 7590

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

Source

Translator

北京大学程序设计实习,Xie Di

     这道题我做的很郁闷,代码也写的不好、很长,方法也一般,有点麻烦,自己都觉得很烂,在提交的时候,发现别人的代码写的很简练,但是不知道自己该怎么改进,希望大家多多提意见,谢谢大家了!

  1#include <string.h>
  2#include <stdio.h>
  3#define LENGTH 100
  4
  5typedef struct Number
  6{
  7    int number;
  8    int point;
  9    int power;
 10}
Number;
 11
 12void ConverTo(char *ch, int *real, int *p)
 13{
 14    int b = 1 ,sign = 1;
 15    char *= ch;
 16    *real = 0;
 17    *= 0;
 18    for( ; *!= '\0' && *!= '.'; c++)
 19        *real = (*real)*10 + (*- '0');
 20    if*== '\0')
 21    {
 22        *= 0;
 23    }

 24    else
 25    {
 26        *= c-ch;
 27        while*(++c) != '\0')
 28            *real = (*real)*10 + (*- '0');
 29        *= c-ch-1- *p;
 30    }

 31}

 32
 33void Caculate(int *number, int real, int *p, int n, int size)
 34{
 35    int sum = 0;
 36    int i ,t1, t2;
 37    t1 = t2 = 0;
 38    while( n-- > 0)
 39    {
 40        for(i = size-1; i >= 0; i--)
 41        {
 42            t1 = number[i]*real +t2;
 43            number[i] = t1 % 10000;
 44            t2 = t1 / 10000;
 45        }

 46        sum += *p;
 47    }

 48    *= sum;
 49}

 50
 51void Convert(char *ch, int *index, int *number, int *left, int right)
 52{
 53    int temp;
 54
 55    while(*left <= right)
 56    {
 57        temp = number[(*left)++];
 58        ch[(*index)++= temp/1000 + '0';
 59        temp  -= (temp/1000* 1000;
 60        ch[(*index)++= temp/100 + '0';
 61        temp -= (temp/100* 100;
 62        ch[(*index)++= temp/10 + '0';
 63        ch[(*index)++= temp%10 + '0';
 64        
 65    }

 66}

 67void ConverToChar(char *ch, int length,int *number, int left, int right, int point)
 68{
 69    int last,index, temp, p;
 70    index = 0;
 71    p = point/4;
 72
 73    Convert(ch, &index, number, &left, p-1);
 74    temp = number[left++];
 75    for(last = 0,p = 1000; last < 4; last++, p /= 10)
 76    {
 77        if( (4*(left-1+ last) == point)
 78            ch[index++= '.';
 79        ch[index++= temp/+ '0';
 80        temp -= (temp/p) * p;
 81    }

 82    Convert(ch, &index, number, &left, right);
 83}

 84
 85void Print(int *number, int p, int size)
 86{
 87    int left, right,index;
 88    char ch[200];
 89
 90    index = (size*4-p)/4;
 91    memset(ch, 0sizeof(ch));
 92
 93    for(left = 0; left < index; left++)
 94    {
 95        if(number[left] == 0)
 96            continue;
 97        else
 98            break;
 99    }

100    for(right = size-1; right > index; right--)
101    {
102        if(number[right] == 0)
103            continue;
104        else
105            break;
106    }

107    ConverToChar(ch, sizeof(ch)-1, number, left, right, size*4-p);
108    for(left = 0; ch[left] == '0'; left++)
109        ;
110    for(right = sizeof(ch)-1; ch[right] == '\0' || ch[right] == '0'; right--)
111        ;
112    if(ch[right] == '.')
113        right--;
114    while(left <= right)
115        printf("%c", ch[left++]);
116    printf("\n");
117}

118
119int main(int argc, char* argv[])
120{
121
122    char ch[7];
123    Number n[LENGTH];
124    int i = 0, count = 0, p = 0;
125    int number[30];
126    memset(ch, 0sizeof(ch));
127    while(scanf("%s %d", ch, &p) == 2)
128    {
129        ConverTo(ch, &n[count].number, &n[count].point);
130        n[count].power = p;
131        if(!(p<= 25 && p >0|| !(n[count].number> 0 && n[count].number < 99999))
132        {
133            break;
134        }

135        memset(ch,0sizeof(ch));
136        count++;
137    }

138    while(i < count)
139    {
140        memset(number, 0sizeof(number));
141        number[sizeof(number)/sizeof(int)-1= 1;
142        Caculate(number, n[i].number, &n[i].point, n[i].power, sizeof(number)/sizeof(int)); 
143        Print(number,n[i].point,sizeof(number)/sizeof(int));
144        i++;
145    }

146    return 1;
147}

来自:1001题探讨

 

分类: 算法艺术 设计模式

上一篇:acm1007探讨:DNA排序   下一篇:ACM1003探讨:Hangover