高精度(加减乘)改
来源:互联网 发布:中国网络发展的评价 编辑:程序博客网 时间: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
- 高精度(加减乘)改
- 高精度加减乘模版
- 高精度加减乘运算
- 【模板】高精度--加减乘
- 转载高精度加减乘除法
- 【模板】高精度(加减乘)
- POJ-1405 Heritage-高精度加减乘
- 【模板】高精度 加减乘 重载法
- 【高精度计算】加减乘模板(水)
- 【高精度模板】【高精加减乘没有除】
- 高精度加减
- 【高精度 乘】
- pascal 高精度压位(加减乘&高精除单精)
- 多项式加减乘运算
- 多项式的加减乘
- 多项式之加减乘
- 矩阵加减乘
- 加减乘算24
- Python环境安装
- C++ 深拷贝与浅拷贝&重载赋值运算符
- ios pushViewController 无效果
- (NYoj 195)飞翔 -- 最长递增子序列
- 高精度计算(高精度乘高精度,高精度减高精度)
- 高精度(加减乘)改
- C++ string基本用法
- 4-25 字符串
- 怎么将xls文件导入到MySQL数据库
- 2015年05月10日
- 5-16 选择排序
- 20150515cxb
- 5-16 插入排序
- 5.16cxb排序题目