首页 > 学院 > 开发设计 > 正文

高精度幂的计算

2019-11-06 07:20:19
字体:
来源:转载
供稿:网友
#include <iostream>   #include<iomanip>   #include<cstring>   using namespace std;  int s;  void chen(char a[],char b[])//a=a*b      //高精度乘法{    int i,j,k,l,sum,c[410]={0};      l=strlen(a)+strlen(b);      for(i=strlen(b)-1;i>=0;i--)      for(j=strlen(a)-1,k=i+j+1;j>=0;j--,k--)      {   sum=(b[i]-'0')*(a[j]-'0')+c[k];        c[k]=sum%10;c[k-1] += sum/10;                           }      for(i=c[0] ? 0:1,j=0;i<l;i++)    //结果保存在a中    a[j++]=(c[i]+'0'); a[j]=0;    }    void quw0(char a[]) //去除尾部多余的零   //初始化b{      int i=strlen(a)-1;    while(a[i]=='0')  {a[i]=0;i--;}  }  void jilu(char a[])  //处理小数点,记录位置{      int i,t; for(i=0;i<strlen(a);i++) //判断有没有小数点  if(a[i]=='.') break; if(i!=strlen(a))  //有小数点 {  for(i=strlen(a)-1,s=0;i>=1;i--)// s记录小数位数      if(a[i]!='.') s++;      else break;  if(a[i=0]=='0') //  0.0123变成123      {   for(i=2;i<strlen(a);i++)      if(a[i]!='0') {strcpy(a,&a[i]);break;}     }    else    //将1.4321 变成14321           {   for(t=0,i=1;i<strlen(a)-1;i++)              {   if(a[i]=='.') t=1;                   if(t) a[i]=a[i+1];              }              a[i]=0;          }  }    }     void show(char a[])  //处理结果{   int i;      if(s>=strlen(a)) cout<<'.'<<setfill('0')<<setw(s)<<a<<endl;// 前面补零       else                                   //不用补零,直接加入小数点输出           {for(i=0;i<strlen(a);i++)           if(strlen(a)-s==i) {cout<<'.'<<&a[i]; break;}              else cout<<a[i];          cout<<endl;          }    }    int main()  {   int n; char b[205],a[205];   while(cin>>b>>n)   { if(n==0) {cout<<1<<endl;continue;}//将n和分为0和非0,如果是0,直接输出1  s=0;  //s为记录小数点的位置,为全局变量  quw0(b);//初始化,把输入的b后面的多余的0去除  jilu(b);  //讲小数化为整数,为后面的高精度乘法做准备  strcpy(a,b);  //用一个新的数组a等效于b,例如b^3=b*b*b=(a*b)*b=(a‘)*b;3个b相乘,  for(int i=2;i<=n;i++)   //就是实现(a*b),然后用a在保存a*b的结果   chen(a,b);  //这个函数等效于a=a*b;    s*=n; //结果的小数位数     show(a);  //输出结果,处理小数点 }   return 0;  }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表