21天学通C++之大数加减法类的设计
来源:互联网 发布:数据库外模式 编辑:程序博客网 时间:2024/05/20 22:30
代码:
//题目描述////应用中需要解决大数运算问题。请设计符号大数类,能支持大数+、-运算和输出。假定本题大数在200位以内。////输入描述////输入两行分别为两个无符号大数////(第一个大数不小于第二个大数)////输出描述////输出它们的和、差////输入样例////1234567890987654321333888999666// 147655765659657669789687967867////输出样例////1382223656647311991123576967533//1086912125327996651544201031799#include<string.h>#include<iostream>using namespace std;class BigNum{private: char num[200]; int length;public: BigNum(); BigNum(const char* rpl); BigNum(const BigNum &rpl); const char* GetNum() const; int GetLength() const; void SetNum(const char *rpl); void SetLength(const int length); BigNum GetSum(const BigNum &b); BigNum GetMinus(const BigNum &b); BigNum& operator=(const char* rpl); BigNum& operator=(const BigNum &rpl); void Print(); ~BigNum();};BigNum::BigNum(){ length=0;}BigNum::BigNum(const char* rpl){ strcpy(this->num,rpl); this->length=strlen(this->num);}BigNum::BigNum(const BigNum &rpl){ strcpy(this->num,rpl.GetNum()); this->length=rpl.GetLength();}const char* BigNum::GetNum() const{ return this->num;}int BigNum::GetLength() const{ return this->length;}void BigNum::SetNum(const char* rpl){ strcpy(this->num,rpl);}void BigNum::SetLength(const int length){ this->length=length;}BigNum BigNum::GetSum(const BigNum &b){ BigNum c; char ans[200]; char s; int i,j,k,flag; i=0,j=0,flag=0; while(i<this->length&&j<b.GetLength()){ if(this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]-'0'+flag>=10){ ans[i]=this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]+flag-10; flag=1; }else{ ans[i]=this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]+flag; flag=0; } i++; j++; } while(i<this->length){ if(this->num[this->length-i-1]+flag-'0'>=10){ ans[i]=this->num[this->length-i-1]+flag-10; flag=1; }else{ ans[i]=this->num[this->length-i-1]+flag; flag=0; } i++; } if(flag==1){ ans[i]=1+'0'; i++; } for(k=0;k<i/2;k++){ s=ans[i-k-1]; ans[i-k-1]=ans[k]; ans[k]=s; } c.SetNum(ans); c.SetLength(i); return c;}BigNum BigNum::GetMinus(const BigNum &b){ BigNum c; char ans[200]; char s; int i,j,k,flag; i=0,j=0,flag=0; while(i<this->length&&j<b.GetLength()){ if(this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag<0){ ans[i]=10+this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag+'0'; flag=1; }else{ ans[i]=this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag+'0'; flag=0; } i++; j++; } while(i<this->length){ if(this->num[this->length-i-1]-flag-'0'<0){ ans[i]=10+this->num[this->length-i-1]-flag; flag=1; }else{ ans[i]=this->num[this->length-i-1]-flag; flag=0; } i++; } for(k=i-1;k>0;k--){ if(ans[k]=='0'){ i--; ans[k]='\0'; }else{ break; } } for(k=0;k<i/2;k++){ s=ans[i-k-1]; ans[i-k-1]=ans[k]; ans[k]=s; } c.SetNum(ans); c.SetLength(i); return c;}BigNum& BigNum::operator=(const char* rpl){ strcpy(this->num,rpl); this->length=strlen(rpl); return *this;}BigNum& BigNum::operator=(const BigNum &rpl){ strcpy(this->num,rpl.GetNum()); this->length=rpl.GetLength(); return *this;}void BigNum::Print(){ for(int i=0;i<this->length;i++){ cout<<this->num[i]; } cout<<endl;}BigNum::~BigNum(){}int main(){ BigNum a,b,c; char n[200]; char m[200]; while(cin>>n>>m){ a=n; b=m; c=a.GetSum(b); c.Print(); c=a.GetMinus(b); c.Print(); }}
算法注意要点:
在利用字符串表示大数进行大数计算的过程中,最主要是要注意字符串是字符类型而进行计算的”数”要用整数的方式来计算。所以在判断两个数同位相加的时候判定是否需要借位时要减合适数量的’0’才行,而将一位的结果赋值给结果字符串时需要保证这个结果是数字的相应的那个字符。
加法需要额外确定以下最后一位是否为1,减法需要额外将是0的高位数给删除。
0 0
- 21天学通C++之大数加减法类的设计
- 大数算法之大数加减法
- 大数加减法的string类实现
- 实现大数的加减法
- c++之大数 实现加减法
- 大数运算之高精度加减法
- c++大数加减法的实现
- 大数的加减法—C++
- 大数加减法 C语言 包含负数
- 大数加减法
- 大数加减法
- 大数加减法
- 大数加减法
- 大数加减法
- 大数的加减法、乘除法 code
- 【c++】复数加减法类
- 谈谈C里面的指针之二【指针的加减法】
- 谈谈C里面的指针之二【指针的加减法】
- 史上最全的SpringMVC学习笔记
- 杭电ACM2019:数列有序
- ios 查看文件是否支持64位
- Android多语言,应用内切换语言
- YJKJ公众号开发流程
- 21天学通C++之大数加减法类的设计
- 【Spring】Bean的配置
- StringBuffer类的使用
- 4412安卓性能优化
- 使用AFNetworking遇到异常 Request failed: unacceptable content-type: text/html
- Ubuntu9.10安装FTP服务
- windows fiddler安装证书失败 解决办法
- 工具-SVN
- gulp的安装和使用