数据结构作业一:
大数加法的顺序表(数组)实现:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5000;//大整数最大精度
class big_int //大整数类
{
private:
char digit[maxn];//储存数位;
public:
big_int(){}; //构造一:
big_int(big_int &a); //构造函数
~big_int(){}; //析构
big_int operator+(big_int &a);
//big_int operator=(big_int &a);
void get(char a[]);
void show();
};
void big_int::get(char a[])
{
int n=strlen(a);
for(int i=0;i<n;i++)
{
digit[i]=a[i];
}
return;
}
void big_int::show()
{
printf("%s",digit);
return ;
}
big_int::big_int(big_int &a)
{
int n=strlen(a.digit);
for(int i=0;i<n;i++)
digit[i]=a.digit[i];
}
big_int big_int::operator+(big_int &a)
{
big_int now;
int n=strlen(this->digit);
int m=strlen(a.digit);
bool fa=false;
if(n>m){
for(int i=0;i<n-m;i++)
{
now.digit[i]=this->digit[i];
}
for(int i=0;i<m;i++)
{
now.digit[n-m+i]=this->digit[n-m+i]+a.digit[i]-'0';
}
}
else
{
for(int i=0;i<m-n;i++)
{
now.digit[i]=a.digit[i];
}
for(int i=0;i<n;i++)
{
now.digit[m-n+i]=this->digit[i]+a.digit[m-n+i]-'0';
}
}
int intnow=0;
for(int i=max(n,m)-1;i>=0;i--)
{
now.digit[i]+=intnow;
if(now.digit[i]-'9'>0)
{
intnow=1;
now.digit[i]-=10;
}
else
intnow=0;
}
if(intnow==1)
{
for(int i=max(n,m);i>0;i--)
now.digit[i]=now.digit[i-1];
now.digit[0]=1;
}
return now;
}
/*big_int big_int::operator=(big_int &a)
{
int n=strlen(a.digit);
for(int i=0;i<n;i++)
{
digit[i]=a.digit[i];
}
}*/
int main()
{
char ch[maxn];
printf("请输入大数a:");
scanf("%s",ch);
big_int a,b;
a.get(ch);
printf("\n请输入大数b:");
scanf("%s",ch);
b.get(ch);
big_int c;
c=
a+b;
printf("\n");
a.show();
printf("\n+\n");
b.show();
printf("\n=\n");
c.show();
return 0;
}
大数加法的链表实现;
#include<bits/stdc++.h>
using namespace std;
const int maxn=0x3fff;
class bigint
{
private:
char digit[maxn]; //储存数位;
public:
bigint(){}; //构造一:
bigint(bigint &a); //复制构造函数
bigint operator+(bigint &a); //加法操作
~bigint(){};
void get(char a[]); //赋值函数
void show(); //输出函数
void bigintscan(); //输入函数
};
bigint::bigint(bigint &a){
int n=strlen(a.digit);
for(int i=0;i<n;i++)
this->digit[i]=a.digit[i];
digit[n]='\0';
}
bigint bigint::operator+(bigint &a){
bigint d;
int n=strlen(a.digit);
int m=strlen(this->digit);
//分情况来处理,思路比较清晰;
if(n>m){
//逐步相加部分;
for(int i=0;i<m;i++){
d.digit[i]=a.digit[i]+this->digit[i]-'0';
}
for(int i=m;i<n;i++){
d.digit[i]=a.digit[i];
}
//进位单独操作;
int jinwei=0;
for(int i=0;i<n;i++){
d.digit[i]+=jinwei;
jinwei=(int)(d.digit[i]>'9');
if(jinwei){
d.digit[i]-=10;
}
}
if(jinwei){d.digit[n]='1';d.digit[n+1]='\0';}
else d.digit[n]='\0';
}
else {
//逐步相加部分:
for(int i=0;i<n;i++){
d.digit[i]=a.digit[i]+this->digit[i]-'0';
}
//多的部分直接传递过来就好;
for(int i=n;i<m;i++){
d.digit[i]=this->digit[i];
}
//处理进位操作;
int jinwei=0;
for(int i=0;i<m;i++){
d.digit[i]+=jinwei;
jinwei=(int)(d.digit[i]>'9');
if(jinwei){
d.digit[i]-=10;
}
}
if(jinwei){d.digit[m]='1';d.digit[m+1]='\0';}
else d.digit[m]='\0';
}
return d;
}
void bigint::get(char a[]){
int n=strlen(a);
for(int i=0;i<n;i++)
{
digit[i]=a[n-i-1];
}
digit[n]='\0';
return;
}
void bigint::show(){
int n=strlen(digit);
for(int i=n-1;i>=0;i--){
cout<<digit[i];
}
return ;
}
void bigint::bigintscan(){
string a;
cin>>a;
char b[maxn];
int n=a.length();
for(int i=0;i<n;i++){
b[i]=a[i];
}b[n]='\0';
get(b);
}
int main()
{
bigint a,b;
cout<<"请输入一个数:";
a.bigintscan();
cout<<"请输入第二个数:";
b.bigintscan();
bigint c;
c=a+b;
cout<<"和为:";
c.show();
return 0;
}
总的来说大数加法只需要考虑数的储存,逐位相加,进位,输出即可,又因为相加需要从个位操作,输出是从高位输出可能需要一些考虑;