经师兄点拔终于把这道题给做出来了!!哈哈 !!
这道题是求一个大于0小于99.999n次方,要求是精确结果。基本思路是这样的,先用一个一维字符数组接收数字。然后再将数字保存在整型组里(倒序保存),并用一个整数记住小数点的位数。
接着就是运算了。运算需要三个整型数组,两个用于相乘的数,一个用于保存相乘的结果。我们知道一个x位数乘于一个y位数相乘一定是以(x+y-1)为基数。如300*40000所得的是以1000000为基数,具体结果就是3*4*1000000.我把数组的下标看成是位数减一,就可以这样结绝乘法:
for(i=0;i<len;++i)
for(j=0;j<plen;++j)
presut[i+j]+=b[i]*resut[j];
这样以后了结了乘法,进一步就是处理进位问题。
每一位数大于9就得向上一位进位,此步这样做:
for(i=0;i<len+plen;++i)
{
if(presut[i]>9)
{
presut[i+1]+=presut[i]/10;
presut[i]%=10;
}
最后就只有小数点问题。对于小数点问题,我用指数运算就得到,一个精确到x位的数n次方运算后所得到的数是一个含有x*n位小数的数。此题了结。
具体实现如下:
#include<iostream>
#include<string.h>
#define max 201
using namespace std;
void pow(int ,int,int*,int*);
void show(int ,int*);
int main()
{
char a[7];
int b[5],point,n,resut[max],j,i,len;
while(cin>>a>>n)
{
memset(resut, 0, sizeof(resut) );
point=0;
len = strlen(a) ;
for(i=5,j=0;i>=0;i--)
{
if(a[i]=='.')
{
point=5-i;
len--;
}
else
{
b[j]=a[i]-'0';
resut[j]=a[i]-'0';
j++;
}
}
pow(n,len,resut,b);
show(point*n,resut);
}
return 0;
}
void pow(int n,int len,int *resut,int *b)
{
int presut[max];
int plen,i,j,k;
plen=len;
memset(presut, 0, sizeof(presut)) ;
for(k=1;k<n;++k)
{
for(i=0;i<len;++i)
for(j=0;j<plen;++j)
presut[i+j]+=b[i]*resut[j];
for(i=0;i<len+plen;++i)
{
if(presut[i]>9)
{
presut[i+1]+=presut[i]/10;
presut[i]%=10;
}
}
i=max-1;
while(presut[i]==0)
--i;
plen=i+1;
for(i=0;i<plen;++i)
resut[i]=presut[i];
memset(presut, 0, sizeof(presut)) ;
}
}
void show(int point,int *resut)
{
int plen,i,z;
i=max-1;
while(resut[i]==0&&i>=0)
--i;
plen=i;
if(plen==-1)
{
cout<<'0'<<endl;return ;
}
if(point>plen+1)
{
cout<<'.';
for(i=0;i<point-plen-1;++i)
cout<<'0';
}
i = 0 ;
while(resut[i] == 0 && i < point)
i++ ;
z=i;//找出结果后面且在小数点后面0的个数
for(i=plen;i>=z;--i)
{
if(i==point-1)
cout<<'.';
cout<<resut[i];
}
cout<<endl;
}