• 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;
    }
  • 相关阅读:
    学习minix 3(未完成)
    排序
    分析nat穿越(未完成)
    固定增量感知器
    分析7zip(未完成)
    分析easyVM 未完成)
    分析wrk,crk
    分析vczh的东东(未完成)
    标 题: 三维游戏里面的自动寻路的算法可能是什么样的?
    几个googlecode
  • 原文地址:https://www.cnblogs.com/soyscut/p/3218094.html
Copyright © 2020-2023  润新知