注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

PKU 1001 Exponentiation  

2011-05-07 19:59:12|  分类: ACM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*
PKU 第1001题 Exponentiation

184k    32ms

*/
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void trim(char *tmp)     ////去除头部和尾部多余的0
{
  int i,j,len;
  len=strlen(tmp);
  for(i=0;i<len;i++)
  {
     if(*(tmp+i)=='.') break;
  }
  if(i<len)
  {
      for(i=len-1;;i--)
     {
       if(*(tmp+i)!='0')
       {
         break;
       }
     }
     if(*(tmp+i)=='.')
     {
       *(tmp+i)='\0';
     }
     else
     {
       *(tmp+i+1)='\0';
     }
  }
  len=strlen(tmp);
  for(i=0;;i++)
  {
    if(*(tmp+i)!='0')  break;
  }
  for(j=i;j<len;j++)
    *(tmp+j-i)=*(tmp+j);
  *(tmp+j-i)='\0';
  if(strlen(tmp)==0)
  {
    tmp=realloc(tmp,2);
    *(tmp)='0';
    *(tmp+1)='\0';
  }
}
int solve_one(char base[],int exp)    
{
   int i,j,k,mul,sum,carry,cur,align,pointPos,len,flag;
   char *tmp,*tmp1,*addNum1,*addNum2,*addResult,*result,temp,*base1;
   base1=malloc(sizeof(char)*(strlen(base)+1));
   strcpy(base1,base);
   if(strlen(base)==1&&*(base)=='0')  //////输入的数为0^n 情况
   {
      printf("0\n");
      return 1;
   }
   if(exp==0)    ////x^0=1
   {
      printf("1\n");
      return 1;
   }
   if(*base=='.')  ///处理类似于.011^5 的情况,往头部添加0,变为0.011^5
   {
      base1=realloc(base1,strlen(base1)+2);
      *(base1+strlen(base1)+1)='\0';
      for(i=strlen(base1);i>0;i--)
          *(base1+i)=*(base1+i-1);
      *(base1)='0';
   }
   tmp=(char *)malloc(sizeof(char)*(strlen(base1)+1));
   strcpy(tmp,base1);
    if(exp==1)          //指数为1时,直接输出
   {
      trim(tmp);
      printf("%s\n",tmp);
      return 1;
   }
   len=strlen(base1);
   for(i=0;i<strlen(tmp);i++)      //记录小数点的位置    
   {

      if(*(tmp+i)=='.')
      {
         break;
      }
   }
   if(i<strlen(tmp))
   pointPos=len-i-1;
   else
   pointPos=0;
   for(i=1;i<exp;i++)    //执行指数次exp的乘法     
   {
      result=(char *)malloc(1*sizeof(char));
      align=1;
      flag=1;      
      for(j=(strlen(base1)-1);j>=0;j--) 
      {
         if(*(base1+j)!='.')       
         {
            tmp1=(char *)malloc(1*sizeof(char));
            carry=0;      
            cur=0;
            for(k=(strlen(tmp)-1);k>=0;k--)
            {
              if(*(tmp+k)!='.')
              {
                 mul=(*(base1+j)-'0')*(*(tmp+k)-'0')+carry;    
                 carry=mul/10;     
                 *(tmp1+cur)=mul%10+'0';
                 cur++;
                 tmp1=realloc(tmp1,cur+1);
              }
            }
            if(carry)
            {
               *(tmp1+cur)=carry+'0';
               cur++;
               tmp1=realloc(tmp1,cur+1);
              
            }
            *(tmp1+cur)='\0';
            if(flag)
            {
               for(k=0;k<strlen(tmp1);k++)
               {
                   *(result+k)=*(tmp1+k);
                   result=realloc(result,k+2);
               }
               *(result+k)='\0';
               flag=0;
            }
            else
            {
              
               addResult=(char *)malloc(1*sizeof(char));
               cur=0;
               addNum1=result;
               addNum2=tmp1;
               for(k=1;k<=align;k++)    
               {
                  *(addResult+cur)=*(addNum1++);
                  cur++;
                  addResult=realloc(addResult,cur+1);
               }
               align++;   
               carry=0;   
               while(*(addNum1)!='\0'&&*(addNum2)!='\0')
               {
                  sum=(*(addNum1++)-'0')+(*(addNum2++)-'0')+carry;
                  carry=sum/10;
                  *(addResult+cur)=sum%10+'0';
                  cur++;
                  addResult=realloc(addResult,cur+1);
               }
               while(*(addNum1)!='\0')    
               {
                  if(carry)    
                  {
                    sum=(*(addNum1++)-'0')+carry;
                    carry=sum/10;
                    *(addResult+cur)=sum%10+'0';
                  }
                  else
                  {
                     *(addResult+cur)=*(addNum1++);
                  }
                  cur++;
                  addResult=realloc(addResult,cur+1);
               }
               while(*(addNum2)!='\0')    
               {
                  if(carry)     
                  {
                     sum=(*(addNum2++)-'0')+carry;
                     carry=sum/10;
                     *(addResult+cur)=sum%10+'0';
                  }
                  else
                  {
                     *(addResult+cur)=*(addNum2++);
                  }
                  cur++;
                  addResult=realloc(addResult,cur+1);
               }
               if(carry)          
               {
                    *(addResult+cur)=carry+'0';
                    cur++;
                    addResult=realloc(addResult,cur+1);
               }
               *(addResult+cur)='\0';
               if(strlen(result)<strlen(addResult))
               {
                  result=realloc(result,sizeof(char)*(strlen(addResult)+1)); 
               }
               strcpy(result,addResult);
               free(addResult);
            }
            free(tmp1);
         }
      }
      for(k=0,j=strlen(result)-1;k<j;k++,j--) 
      {
          temp=*(result+k);
          *(result+k)=*(result+j);
          *(result+j)=temp;
      }
      if(strlen(tmp)<strlen(result))
      {
          tmp=realloc(tmp,sizeof(char)*(strlen(result)+1));
      }
      strcpy(tmp,result);
      free(result);
   }
  
   pointPos=pointPos*exp;
   tmp=realloc(tmp,sizeof(char)*(strlen(tmp)+2));
   len=strlen(tmp);
   tmp=tmp+len+1;     
   *tmp='\0';
   tmp--;
   for(i=0;i<pointPos;i++)     
   {
     *(tmp--)=*(tmp-1);
   }
   *tmp='.';
   for(i=0;i<len-pointPos;i++)
   {
     tmp--;
   }
   trim(tmp);
   printf("%s\n",tmp);
   return 1;
}
int main()
{
  char a[7];
  int b,count=1;
    while(scanf("%s %d",a,&b)==2)
   {    
       solve_one(a,b);
   }
    return 0;
}

  评论这张
 
阅读(161)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017