POJ1001 Exponentiation

超越double,高精度实数求幂运算
大二的时候写过大整数的运算,这道acm题目则是实数高精度运算。
分步的思想,先将小数点删除作为大整数运算,模拟一遍手算乘法的过程小数点位置,只需要通过看是几位小数乘几位小数即可,大部分借鉴了他人的代码,理解就花了很长时间,但做了多余条件的删选,不失为一个实用的轮子。
另,这里是用字符串接受输入,要通过ascii码转化,看了java版本好像更精炼。

#include <iostream>
#include <string>

using namespace std;

int main()
{
     string mlp;     //乘数
     int power;     //乘数的幂
     int r[151];    //保存结果
     int hdot;
     while(cin>>mlp>>power)
     {
          hdot=0;       //小数点位置,从右侧计起
          //初始化存放结果,每一位都为1
          for(int t=0;t<150;t++)
          {
            r[t]=-1;
          }
          //存在小数点的情况
          if(mlp.find(".")!=string::npos)
            hdot=mlp.length()-mlp.find(".")-1;
          //itr迭代器的指向末尾字母
          string::iterator itr=mlp.end()-1;
          //小数点不在0位,开始迭代
          while(hdot>0&&itr>=mlp.begin())
          {
            //若小数点存在数字间,去掉末尾的无效零
            if(*itr!='0')
            {
                break;
            }
            //否则,后移
           hdot--;
           itr--;
          }
          int cn=0;
          //迭代器前移
          //r数组从0开始存放临时结果,0为最低位。cn为临时结果的下标
          while(itr>=mlp.begin())
          {
               if(*itr!='.')
               {
                    r[cn]=*itr-'0';
                    cn++;
               }
               itr--;
          }
          int k=cn-1;   //下标从cn-1开始,cn-1为最高位
          int m=0;     //保存临时数;
          while(k>-1)
          {
               m=m*10+r[k];
               k--;
          }
          for(int i=1;i<power;i++)
          {
               int j=0;
               while(r[j]>-1)
               {
                    r[j]=r[j]*m;
                    j++;
               }
               j=0;
               while(r[j]>-1)
               {
                   //j+1位置上仍是-1,把大于10的部分进位
                    if(r[j+1]==-1&&r[j]>=10)
                     r[j+1]=r[j]/10;
                    else
                     r[j+1]+=r[j]/10;
                    r[j]=r[j]%10;
                    j++;
               }
          }
          //小数点的位置
          hdot=hdot*power;
          int cnt=0;
          while(r[cnt]>-1)
          {
           cnt++;
          }
          if(hdot>=cnt)
          {
               cout<<".";
               while(hdot>cnt)
               {
                    cout<<"0";
                    hdot--;
               }
               //小数点位置置为0
               hdot=0;
          }
          for(k=cnt-1;k>=0;k--)
          {
               //当前位的前一位为小数点位
               if((k+1)==hdot)
                    cout<<".";
                cout<<r[k];
          }
          cout<<endl;
         }
         return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值