hdu 1063 Exponentiation

来源:互联网 发布:淘宝开店加盟靠谱吗 编辑:程序博客网 时间:2024/06/17 19:11
    题目描述参考杭电。本题需要考虑前导0和后导0,比如0001.2 1.2222还有.222之类的。需要注意的是:当去掉后导0的时候一定要考虑1000和1.0000的关系
代码实现:
#include<stdio.h>
#include<string.h>

char str[100];
intn,m,ar[1000],arlen,ans[1000],anslen;//ar是保存初始数据,ans保存中间和结果,anslen为ans数组的长度,arlen同理

int Judge(){
int i,l=strlen(str);
for(i=0;i<l;i++)
if(str[i]=='.')
return 1;
return 0;
}
int get(){
    inti=strlen(str)-1,l,sum=0;
m=0;
if(Judge()){//判断是否是小数,然后去掉小数后面的后导0
while(str[i]=='0' || str[i]=='.'){
   i--;
   if(str[i+1]=='.')
   break;
   }
  str[i+1]='\0'; 
}
l=strlen(str);
    m=0;
   for(i=l-1;i>=0;i--){
       if(str[i]=='.')
          break;
       m++;
    }
   if(i<0)
       m=0;
for(i=0;i<l;i++){//去掉小数点再转换成整数
if(str[i]=='.')
continue;
sum*=10;
sum+=str[i]-'0';
}
return sum;
}
int init(){
int i=0,h;
h=get();
while(h>0){//转换成数组,并且从低位到高位的思想(比如123,存进数组为ans[0]=3,ans[1]=2,ans[2]=3)
ar[i]=h;
ans[i]=ar[i];
i++;
h/=10;
}
anslen=i;
arlen=i;
if(anslen==0){//判断底数是否为0
printf("0\n");
return 0;
}
return 1;
}

void solve(){
    int i,j,h[1000];
memset(h,0,sizeof(h));
for(i=0;i<anslen;i++)
for(j=0;j<arlen;j++)
h[i+j]+=ans[i]*ar[j];
anslen+=arlen-1;
for(i=0;i<anslen;i++){
h[i+1]+=h[i]/10;
h[i]%=10;
}
while(h[i]>=10){h[i+1]+=h[i]/10;h[i]%=10;i++;}
if(h[i]>0)
i++;
anslen=i;
for(i=0;i<anslen;i++)
ans[i]=h[i];
}

void out(int x){
printf(".");
int i;
for(i=0;i<x;i++)
printf("0");
}
void deal(){
int i,j=-1;
m*=n;
if(m>anslen){
out(m-anslen);
}
else
j=m-1;
for(i=anslen-1;i>=0;i--){
if(i==j)
printf(".");
printf("%d",ans[i]);
}
printf("\n");
}
void make(){
int t=n;
if(init()){
       while(--t)solve();//迭代n-1次
deal();//输出处理
}
}

int main(){
while(scanf("%s%d",str,&n)!=EOF){
make();
}
return 0;
}
原创粉丝点击