hdu 1063 Exponentiation

      题目描述参考杭电。本题需要考虑前导0和后导0,比如0001.2   1.2222还有.222之类的。需要注意的是:当去掉后导0的时候一定要考虑1000和1.0000的关系
代码实现:
#include<stdio.h>
#include<string.h>

char str[100];
int n,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(){
    int i=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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值