码迷,mamicode.com
首页 > 其他好文 > 详细

Exponentiation UVA 748

时间:2014-07-31 00:08:15      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:acm   c   源代码   算法   uva   

//算法:获得无小数点的输入串,然后对该串进行普通的高精度乘法运算
//运算得到结果后,添加小数点,最后除去串头和串尾的0即可
#include <stdio.h>
#define MAXN 200

char R[10];
char E[6];//寄存无小数点的输入串
char temp[MAXN];
char ans[MAXN];//寄存答案串
int n,left;

void multip();

int main(){
 int i,j,k;
 int cnt;
// freopen("data","r",stdin);
 while(scanf("%s%d",R,&n)==2){
   left=MAXN-2;//数组最后一位保留,留着添加小数点

   for(i=0,j=0;i<7;i++,j++){//取得去掉小数点的数字串
    if(R[6-i]=='.'){
     cnt=i-1;
     cnt*=n;
     j--;
     continue;
    }
    ans[left]=E[5-j]=temp[left]=R[6-i];
    left--;
   }

  left++;
  for(i=1;i<n;i++)//进行普通的高精度乘法运算
   multip();
  for(i=0;i<cnt+1;i++)//添加小数点
   ans[MAXN-1-i]=ans[MAXN-2-i];
  ans[MAXN-1-i]='.';
 
 while(ans[left]=='0')//去除串首的0
 left++;
 
 i=0;
 while(ans[MAXN-2-i]=='0'){//去除串尾的0
 ans[MAXN-2-i]=ans[MAXN-1-i];
 i++;
 }

 if(ans[MAXN-2-i]=='.') ans[MAXN-2-i]=ans[MAXN-1-i];//无小数则去除小数点

 printf("%s\n",ans+left);
 }
 return 0;
}

void multip(){//普通高精度乘法运算,结果存入temp,完成后复制回ans
 int i,j,k,pos,product,carry;
 int x_len,y_len;
 char *p=ans+left;
 x_len=strlen(p);
 y_len=strlen(E);
 k=left=MAXN-2;//数组最后一位保留
 temp[MAXN-2]='\0';
 for(i=0;i<MAXN-2;i++)
 temp[i]='0';

 for(i=y_len-1;i>=0;i--){
  k--;
  pos=k;
  carry=0;
  for(j=x_len-1;j>=0;j--){
   product=(E[i]-'0')*(p[j]-'0')+temp[pos]-'0'+carry;
   temp[pos]=product%10+'0';
   pos--;
   carry=product/10;
  }

  while(carry){
   carry+=temp[pos]-'0';
   temp[pos]=carry%10+'0';
   pos--;
   carry/=10;
  }

  left=left<=pos+1?left:pos+1;
 }

 for(i=left;i<MAXN;i++)
  ans[i]=temp[i];

 return;
}


Exponentiation UVA 748,布布扣,bubuko.com

Exponentiation UVA 748

标签:acm   c   源代码   算法   uva   

原文地址:http://blog.csdn.net/u011915301/article/details/38306795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!