求浮点数的乘方

求浮点数的乘方, 比如R^n次方 PKU ACM 1001

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
代码
 
 
  1. #include<stdio.h>
  2. #include<memory.h>
  3. #include<string.h>
  4. typedef struct
  5. {
  6.   int digits[1000];
  7.   int len;  //长度
  8.   int pos;  //小数点位置
  9. }bigfloat;
  10. //打印一个bigfloat
  11. void print_bigfloat(bigfloat big)
  12. {
  13.   int i=0;
  14.   int j=0;
  15.   while(big.digits[big.len-1-i]==0&&big.len-big.pos>i)
  16.  i++;
  17.   while(big.digits[j]==0&&j<big.pos)
  18.  j++;
  19.   for(;i<big.len-j;i++)
  20.   {
  21.  if(big.pos==big.len-i) putchar('.');
  22.     printf("%d",big.digits[big.len-1-i]);
  23.   }
  24. }
  25. //b*c
  26. bigfloat b_c( bigfloat b, bigfloat c )
  27. {
  28.   int i,j;
  29.   bigfloat res;
  30.   memset(res.digits,0,sizeof(res.digits));  //置0
  31.   res.pos=b.pos+c.pos;         //处理小数点位
  32.   res.len=b.len+c.len;         //处理长度
  33.   //计算一次
  34.   for(i=0;i<b.len;i++)
  35.     for(j=0;j<c.len;j++)
  36.       res.digits[i+j]+=b.digits[i]*c.digits[j];
  37.   //处理进位
  38.   for (i=0;i<res.len;i++)
  39.     if (res.digits[i]>9)
  40.  {
  41.       res.digits[i+1]+=res.digits[i]/10;
  42.       res.digits[i]%=10;
  43.       while (res.digits[res.len]) res.len++;
  44.  }
  45.   return res;
  46. }
  47. //求大数s的n次幂
  48. bigfloat bigpow(bigfloat s, int n )
  49. {
  50.   bigfloat res;
  51.   if(n==1) return s;
  52.   if(n==2) return b_c(s,s);
  53.   return b_c(s,bigpow(s,n-1));
  54. }
  55. //输入一个浮点型大数
  56. bigfloat get_one(char str[10])
  57. {
  58.   int len_str;
  59.   int len=0;
  60.   int i;
  61.   bigfloat one;
  62.   memset(one.digits,0,sizeof(one.digits));  //置0
  63.   one.len=0;
  64.   one.pos=0;
  65.   len_str=strlen(str);
  66.   for(i=0;i<len_str;i++)
  67.   {
  68.     if(str[len_str-1-i]=='.') one.pos=i;
  69.     else
  70.  {
  71.    one.digits[len]=str[len_str-1-i]-'0';
  72.    len++;
  73.  }
  74.   }
  75.   one.len=len;
  76.   return one;
  77. }
  78. int main()
  79. {
  80.   bigfloat s;
  81.   char str[10];
  82.   int n;
  83.   while(scanf("%s %d",str,&n)!=EOF)
  84.   {
  85.     s=get_one(str);
  86.     print_bigfloat(bigpow(s,n));
  87.     putchar('/n');
  88.   }
  89.   return 0;
  90. }
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值