大数的n次方

把题分成三部分:

1、把数字逆序存放,以方便乘法时从后一位乘起的规则,记下小数点的位置,在相乘时去掉小数点,在结果输出时再添加小数点;

2、用循环得数的幂次方(注意把每次相乘要放的数组清零);

3、输出(注意输出格式,如整数部分只有0时直接输出小数点,小数点后的末尾的0不要输出等)。

主要是把大数的每一位放在一个数组里存放

#include<iostream>
#include<cstring>
#define max 201
using namespace std;

int rr[max], rr1[max];
void Pow(int n, int *r, int len)
{
 int len1,i,j,k,l,d;
 len1=len;
 for(i=1;i<n;i++)           //以其幂为界限
 {
  for(j=0;j<len;j++)
  {
   for(k=0;k<len1;k++)
   {
    rr[j+k]+=r[j]*rr1[k];    //仿照数字相乘时进对位相乘
   }
  }
  for(k=0;k<len+len1;k++)  
  {
   if(rr[k]>9)      //进位
   {
    rr[k+1]+=rr[k]/10;
    rr[k]=rr[k]%10;
   }
  }
  l=max-1;
  while(rr[l]==0)   
   l--;
  len1=l+1;      //计算每一次相乘完的长度
  for(d=0;d<len1;d++)
   rr1[d]=rr[d];
  memset(rr, 0, sizeof(rr)) ;  //赋值后清零,以便下一次的相乘时的计算
 }
}
void show(int point)                                   //注意输出格式
{
 int i,len,j,k,d;
 i=max-1;
 while(rr1[i]==0 && i>=0)                           //计算实际长度
  i--;                              
    len=i+1;
 if(len==0)                                                //如果全为0,则直接输出0
 {
  cout<<'0'<<endl;
  return ;
 }
 if(point>len)                                                      //如果结果的小数点大于相乘得到的数字长度则先输出小数点,然后用0补不够的位数
 {
  cout<<'.';
  for(j=0;j<point-len;j++)
   cout<<'0';
 }
 k=0;
 while(rr1[k]==0 && k<point)                        //计算小数点后且是末尾为0的长度
  k++;
 for(d = len-1; d>= k; d--)  
 {   
   if(d == point - 1)                                           //找到小数点的位置,输出小数点
    cout<<"." ;
   cout<<rr1[d] ;
 }
 cout<<endl;
}
int main()
{
 char m[7];
 int r[5];
 int n,i,point,len,j;
 while (cin>>m>>n)
    {
  memset(rr, 0, sizeof(rr)) ;
  memset(rr1, 0, sizeof(rr1));  //清零,以便输入下一组数据时用
  point=0;
  len=strlen(m);
  j=0;
  for(i=5;i>=0;i--)
  {
   if(m[i]=='.')
   {
    point=5-i;  //计算小数点后的位数
    len=len-1;    
   }
   else
   {
    r[j]=m[i]-'0';
    rr1[j]=m[i]-'0';
    j++;
   }
  }
  Pow(n, r, len) ;
  show(point * n) ;
 
 }
 return 0;
}

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值