• POJ1001Precision power


    转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1305298222

    浮点大数求幂,水题一道,把“大数乘浮点数”按指数循环就OK了,注意结果的整数部分若为0,则不保留整数部分。小数部分若为0,则不保留小数部分和小数点。

     

      1 //Memory Time 
    2 //1232K 0MS
    3
    4 #include<iostream>
    5 #include<string>
    6 using namespace std;
    7
    8 const int size=1000; //大数位数
    9
    10 void mult(char* A,char* B,char* ans)
    11 {
    12 int i,j,k;
    13
    14 int fract; //总小数个数
    15 int dot=-1; //小数点位置
    16 for(k=0;A[k]!='\0';k++)
    17 if(A[k]=='.')
    18 dot=k;
    19 int lena=k;
    20 if(dot==-1)
    21 fract=0;
    22 else
    23 fract=lena-dot-1;
    24
    25 dot=-1;
    26 for(k=0;B[k]!='\0';k++)
    27 if(B[k]=='.')
    28 dot=k;
    29 int lenb=k;
    30 if(dot==-1)
    31 fract+=0;
    32 else
    33 fract+=(lenb-dot-1); //总小数个数
    34
    35 int a[size+1]={0};
    36 int b[size+1]={0};
    37 int pa=0,pb=0;
    38
    39 /*倒序*/
    40
    41 for(i=lena-1;i>=0;i--)
    42 {
    43 if(A[i]=='.')
    44 continue;
    45 a[pa++]=A[i]-'0';
    46 }
    47 for(j=lenb-1;j>=0;j--)
    48 {
    49 if(B[j]=='.') //暂时删除小数点
    50 continue;
    51 b[pb++]=B[j]-'0';
    52 }
    53
    54 int c[2*size+1]={0};
    55 int lenc;
    56 for(pb=0;pb<lenb;pb++)
    57 {
    58 int w=0; //低位到高位的进位
    59 for(pa=0;pa<=lena;pa++) // = 为了处理最后的进位
    60 {
    61 int temp=a[pa]*b[pb]+w;
    62 w=temp/10;
    63 temp=(c[pa+pb]+=temp%10);
    64 c[lenc=pa+pb]=temp%10;
    65 w+=temp/10;
    66 }
    67 }
    68
    69 /*倒序,得到没有小数点的ans*/
    70
    71 for(pa=0,pb=lenc;pb>=0;pb--)
    72 ans[pa++]=c[pb]+'0';
    73 ans[pa]='\0';
    74 lena=pa;
    75
    76 /*插入小数点*/
    77
    78 bool flag=true; //标记是否需要删除小数末尾的0
    79 if(fract==0) //小数位数为0,无需插入小数点
    80 flag=false;
    81 else if(fract<lena) //小数位数小于ans长度,在ans内部插入小数点
    82 {
    83 ans[lena+1]='\0';
    84 for(i=0,pa=lena;pa>0;pa--,i++)
    85 {
    86 if(i==fract)
    87 {
    88 ans[pa]='.';
    89 break;
    90 }
    91 else
    92 ans[pa]=ans[pa-1];
    93 }
    94
    95 }
    96 else //小数位数大于等于ans长度,在ans前面恰当位置插入小数点
    97 {
    98 char temp[size+1];
    99 strcpy(temp,ans);
    100 ans[0]='0';
    101 ans[1]='.';
    102 for(int i=0;i<fract-lena;i++) //补充0
    103 ans[i+2]='0';
    104 for(j=i,pa=0;pa<lena;pa++)
    105 ans[j++]=temp[pa];
    106 ans[j]='\0';
    107 }
    108
    109 /*删除ans小数末尾的0*/
    110
    111 if(flag)
    112 {
    113 lena=strlen(ans);
    114 pa=lena-1;
    115 while(ans[pa]=='0')
    116 ans[pa--]='\0';
    117 if(ans[pa]=='.') //小数全为0
    118 ans[pa--]='\0';
    119 }
    120
    121 /*删除ans整数开头的0,但至少保留1个0*/
    122
    123 pa=0;
    124 while(ans[pa]=='0') //寻找ans开头第一个不为0的位置
    125 pa++;
    126
    127 if(ans[pa]=='\0') //没有小数
    128 {
    129 ans[0]='0';
    130 ans[1]='\0';
    131 }
    132 else //有小数
    133 {
    134 for(i=0;ans[pa]!='\0';i++,pa++)
    135 ans[i]=ans[pa];
    136 ans[i]='\0';
    137 }
    138 return;
    139 }
    140
    141 char a[size+1];
    142 char ans[size*size+1];
    143
    144 int main(void)
    145 {
    146 int b;
    147 while(cin>>a>>b)
    148 {
    149 memset(ans,'\0',sizeof(ans));
    150 ans[0]='1';
    151 ans[3]='\0';
    152
    153 for(int i=1;i<=b;i++)
    154 mult(a,ans,ans);
    155
    156 cout<<ans<<endl;
    157 }
    158 return 0;
    159 }
  • 相关阅读:
    JavaEye推荐:软件开发的葵花宝典 zt
    杨建:网站加速系统架构篇
    杨建:网站加速Cache为王篇
    整理:不用ACE你不知道ACE有多烂,给饱受ACE折磨的弟兄们散分了。
    jQuery对select操作 dodo
    easyui事件和方法的调用 dodo
    .Net 下利用ICSharpCode.SharpZipLib.dll实现文件压缩、解压缩 dodo
    使用Jquery EasyUi常见问题解决方案 dodo
    如何切分用户故事 dodo
    什么是产品Backlog,什么是Sprint Backlog? dodo
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2121403.html
Copyright © 2020-2023  润新知