PKU_1002 浮点数N次方的精确计算

来源:互联网 发布:windows to go win8.1 编辑:程序博客网 时间:2024/06/06 17:59

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

Sample Input

95.123 120.4321 205.1234 156.7592  998.999 101.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.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. }

原创粉丝点击