关于大数的操作!!

              经师兄点拔终于把这道题给做出来了!!哈哈 !!

  这道题是求一个大于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值