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; }