高精度(加减乘)改

来源:互联网 发布:中国网络发展的评价 编辑:程序博客网 时间:2024/05/09 04:50

//作者:石门实验学校105王逸伦 //题目:高精度乘法,减法 ,加法 //tips:本程序高精度数输入方法为:‘XXXXXX!’,以‘!’结尾 #include<iostream>#include<fstream>#include<algorithm>int ans[1000000];using namespace std;void _in(int a[],int &len);//输入高精度数 void _turn(int a[],int len);//将高精度数翻转 void _gjdcf(int a[],int b[],int ans[],int len1,int len2,int &len);//高精度乘法 void _out(int a[],int len,bool fh);//输出高精度数 void _gjdjf(int a[],int b[],int ans[],int len1,int len2,int &len);//高精度减法 bool _bj(int a[],int b[],int len1,int len2);//比较高精度数 void _gjdplus(int a[],int b[],int ans[],int len1,int len2,int &len);//高精度加法 //主程序: int main(){ bool fh=true; int a[100000],b[100000],len1=0,len2=0,len=0,mode; memset(ans,0,sizeof(ans)); cout <<"作者:石门实验学校105王逸伦 "<<endl; cout << "加法请输入1,减法请输入2,乘法请输入3"<<endl; cin >> mode; cout << "本程序高精度数输入方法为:‘XXXXXX!’,以‘!’结尾 "<<endl; _in(a,len1);//输入a  _in(b,len2);//输入b  switch (mode) {   case 3:  {   if (len1>len2) _gjdcf(a,b,ans,len1,len2,len); //确保位数多的在上方(竖式乘法)     else _gjdcf(b,a,ans,len2,len1,len);   fh=true;  }  break; case 2:  {  if (_bj(a,b,len1,len2)) {_gjdjf(a,b,ans,len1,len2,len);fh=true;}//确保大数减小数,记录符号    else {_gjdjf(b,a,ans,len2,len1,len);fh=false;}  }  break; case 1:  {   if (len1>len2) _gjdplus(a,b,ans,len1,len2,len); //确保位数多的在上方(竖式乘法)     else _gjdplus(b,a,ans,len2,len1,len);   fh=true;  } default :   {   exit(0);  } }  _out(ans,len,fh);//将高精度数输出(结果) }void _out(int a[],int len,bool fh){ int i=len-1; while (a[i]==0)i--; if (!fh) cout << '-'; for (;i>=0;i--) cout << a[i]; //倒序输出 }void _turn(int a[],int len){ int j=len-1; for(int i=0;i<j;i++,j--) swap(a[i],a[j]);}void _in(int a[],int &len){ char ch; for (;;)  {  cin >> ch;  if (ch=='!') break; //高精度数以‘!’结尾   a[len]=int(ch-48);  //转数字   len++; } _turn(a,len);  //从个位开始,调转,方便下面计算 }void _gjdcf( int a[],int b[],int ans[],int len1,int len2,int &len){ int jw=0,dq=0;  //jw为进位,dq为当前数(未%10)  for(int i=0;i<=len1-1;i++)      for(int j=0;j<=len2;j++)  // 因为当前位最高可能有进位,应再循环一次 (李沈群力友情客串)  {   dq=ans[i+j]+(a[i]*b[j])+jw;   //cout<<dq<<' ';   ans[i+j]=dq % 10;  //取个位    jw=dq / 10;//算进位   //if (j==len2-1) a[i+j+1]=jw;   } len=len1+len2;//未进位长度 ,应加一,因为如果减一,则会少算最高位  for (;jw>0;jw/=10) ans[len++] =jw % 10;//其余进位 }void _gjdjf(int a[],int b[],int ans[],int len1,int len2,int &len){ int tw=0; for (int i=0;i<=len1-1;i++) {  if ((a[i]-b[i]-tw)<0)      //判断是否需要退位   {   ans[i]=a[i]-b[i]-tw+10;   tw=1;  }  else  {   ans[i]=a[i]-b[i]-tw;   tw=0;  }  //cout << i<<' '<<a[i]<<' '<<b[i]<<' '<<ans[i]<<endl; } len=len1;  //长度待定,但最长的是len1 }bool _bj(int a[],int b[],int len1,int len2){ if (len1>len2) return true;  else if (len2>len1) return false; //先比较长度  for (int i=0;i<=len1-1;i++)    if (a[i]>b[i]) return true;     else if (b[i]>a[i]) return false;//逐个比较  cout << 0; exit(0);}void _gjdplus(int a[],int b[],int ans[],int len1,int len2,int &len){ int dq=0,jw=0; for (int i=0;i<=len1-1;i++) {  dq=a[i]+b[i]+jw;  ans[i]=dq % 10;  jw=dq / 10;  //cout << i<<' '<<a[i]<<' '<<b[i]<<' '<<ans[i]<<endl; } len=len1;  //长度待定,但最短的是len1  for (;jw>0;jw/=10) ans[len++] =jw % 10;//其余进位 }


2 0
原创粉丝点击