poj1001求幂

这道题目是实质上就是高精度的乘法,虽然是带小数点的数多少次幂,但是开始我们需要将它变为整数进行求幂,然后再加上小数点,然后要考虑前导0,有效数位问题,做的时候要十分的小心

#include<iostream>
#include<string>
#include<cmath>
using namespace std;

int origin[6];  //输入不会超过6位
int num[200];          //计算的结果
int backnum[200];

int main()
{
     string decim;
    int  ep,i,j,k,numpos,value,resid,count;
    long fpos,efpos; //小数位和有效数位
    int pointflag;
     while(cin>>decim>>ep)
     {
         memset(origin,0,sizeof(origin));
         memset(num,0,sizeof(num));
         memset(backnum,0,sizeof(backnum));
         fpos=0;numpos=0,count=0;
         //将输入的数从后往前存到int数组中
         for(i=decim.size()-1;i>=0;i--)
         {
             //记录第一个不是0的位置
             if(!count&&decim[i]!='0') 
             {
                 efpos=i;count=1;
             }
             //记录小数点出现的位置
             if(decim[i]=='.') fpos=decim.size()-1-i;
             else{
                 //如果是数字,就存下来
                 origin[numpos]=decim[i]-'0';
                 numpos++;
             }
         }
         efpos=fpos-(decim.size()-1-efpos);
         num[0]=1;
         //进行ep次大整数乘法
         for(int x=0;x<ep;x++)
         {
         for(i=0;i<6;i++)
         {
             resid=0;
             for(j=0;j<150;j++)
             {
                 value=num[j]*origin[i]+resid;
                 backnum[j+i]+=(value%10);
                 if(backnum[j+i]>=10)
                 {
                     backnum[j+i]=backnum[j+i]%10;
                     backnum[j+i+1]++;
                 }
                  resid=value/10;
                 
             }
            //if(value==0&&resid==0) break;
         }
         memcpy(num,backnum,sizeof(num));
         memset(backnum,0,sizeof(backnum));
         }
         pointflag=0;
         fpos=fpos*ep;
         efpos=efpos*ep;
         //忽略前导0
         for(i=149;i>=0;i--) if(num[i]) break;
         //判断忽略前导0后,导致实际位数不够的时候填充0的情况
         //即 0.4321 20
         if(i+1<fpos)
        {
            cout<<".";
            for(int z=0;z<fpos-i-1;z++)
            {
                 cout<<"0";
            }
            efpos=efpos-(fpos-i-1);
            pointflag=1;
         }
         for(j=i;j>=0;j--)
         {

             if(j+1==fpos)
             {
                 if(efpos<=0) break;
                 cout<<".";
                 pointflag=1;
             }
             if(pointflag) pointflag++;
             cout<<num[j];
             //如果小数后的位数超过了有效位数,停止:即忽略后0
             if(pointflag>(efpos)) break;
         }
         cout<<endl;
     }
     return 0;
}
原文地址:https://www.cnblogs.com/soyscut/p/3218094.html