POJ 1001 Exponentiation

测试数据没有问题,但是不知道为什么老得到Wrong Answer

  1 #include <stdio.h>
  2 #include <string.h>
  3 #define MAXLEN    1000
  4 struct decimal
  5 {
  6     int num[MAXLEN];
  7     int len;
  8     int frac;
  9 };
 10 
 11 void Product(decimal d1, decimal d2,decimal& d3)
 12 {
 13     int i,j;   //i points to d1,j points to d2
 14     memset(d3.num,0,sizeof(d3.num));
 15     for(j=0;j<d2.len;j++)
 16        for(i=0;i<d1.len;i++)
 17            d3.num[i+j]+=d1.num[i]*d2.num[j];
 18     for(i=0;i<d1.len+d2.len-1;i++)
 19     {
 20         d3.num[i+1]+=d3.num[i]/10;
 21         d3.num[i]=d3.num[i]%10;
 22     }
 23     //here i=d1.len+d2.len-1, the highest bit of d3
 24     int sig=d1.len+d2.len-1;
 25     if(d3.num[sig]!=0)
 26         d3.len=sig+1;
 27     else
 28         d3.len=sig;
 29     //frac
 30     d3.frac=d1.frac+d2.frac;
 31 }
 32 void Reverse(char str[],int len)
 33 {
 34     char x[MAXLEN];
 35     int i;
 36     for(i=0;i<len;i++)
 37         x[i]=str[len-1-i];
 38     for(i=0;i<len;i++)
 39         str[i]=x[i];
 40 }
 41 void Output(decimal& d3)
 42 {
 43     char str[MAXLEN]={0};
 44     int i,j;
 45     for(i=0;i<d3.len && d3.num[i]==0;i++);   //eliminate tail zero
 46     if(i==d3.len)
 47     {
 48        printf("0\n");
 49        return;
 50     }
 51     for(j=0;i<d3.len;i++,j++)
 52     {
 53         str[j]=d3.num[i]+'0';
 54         if(i==d3.frac-1)
 55         {
 56             j++;
 57             str[j]='.';
 58         }
 59     }
 60     //highest bit of str is j-1, len is j;
 61     int len=j;
 62     //eliminate front zero
 63     for(i=len-1;i>=0 && str[i]=='0';i--,len--);
 64     
 65     Reverse(str,len);
 66     
 67     str[len]='\0';
 68     printf("%s\n",str);
 69 }
 70 //string is ended by '\0'
 71 int CountFrac(char str[])
 72 {
 73     int count=0;
 74     int i;
 75     int len=strlen(str);
 76     for(i=0;i<len;i++)
 77        if(str[i]=='.')
 78            return (len-i-1);
 79     return 0;
 80 }
 81 void str2dec(char str[], decimal& d)
 82 {
 83     int i,j;
 84     int len=strlen(str);
 85     d.frac=CountFrac(str);
 86     d.len=0;
 87     for(i=len-1,j=0;i>=0;i--)
 88         if(str[i]!='.')
 89         {
 90             d.num[j]=str[i]-'0';
 91             d.len++;
 92             j++;
 93         }
 94 }
 95 int main()
 96 {
 97     decimal d1,d2,d3;
 98     char base[10];
 99     int n;
100     while(scanf("%s%d",base,&n)!=EOF)
101     {
102         d1.len=strlen(base);
103         memset(d1.num,0,sizeof(d1.num));
104         memset(d3.num,0,sizeof(d3.num));
105         str2dec(base,d1);
106         d3.frac=0;
107         d3.len=1;
108         d3.num[0]=1;
109         for(int i=1;i<=n;i++)
110             Product(d3,d1,d3);
111         Output(d3);
112     }
113 }
posted @ 2012-10-03 18:13  sidereal  Views(278)  Comments(0)    收藏  举报