BigNum Add

#ifndef _ADD_H_
#define _ADD_H_

#include <iostream>
#include <stack>
#include <string>

using namespace std;

class BigNum;

ostream &operator<<(ostream &os, BigNum &bn);
istream &operator>>(istream &is, BigNum &bn);

BigNum &operator+(BigNum &la, BigNum &ra);

class BigNum
{
stack<char> value;
public:
BigNum(const BiugNum &bn)
{
this->value = bn.value;
}
friend ostream &operator<<(ostream &os, BigNum &bn);
friend istream &operator>>(istream &is, BigNum &bn);
friend BigNum &operator+(BigNum &la, BigNum &ra);
};

ostream &operator<<(ostream &os, BigNum &bn)
{
stack<char> temp(bn.value), out;

while(temp.size()>0)
{
out.push(temp.top());
temp.pop();
};

while(out.size()>0)
{
os << out.top();
out.pop();
};

return os;
}

istream &operator>>(istream &is, BigNum &bn)
{
string temp;
is >> temp;
int s = temp.size();
string::iterator it = temp.begin();
for(;it<temp.end();it++)
{
bn.value.push(*it);
}

return is;
}

bool addChar(char a, char b, char &c,int i)
{
char t;
c = a+b-'0'+i;
if((t=c-'9')>0)
{
c = c - 9;
return true;
}
else
{
return false;
}
}

BigNum operator+(BigNum &la, BigNum &ra)
{
bool b;
BigNum resualt;
stack<char> ta, tb, tr;
char a, b;
int i=0, j;

la.value().size>ra.value.size()?
{ta=la.value;tb=ra.value}:{ta=ra.value;tb=la.value}

while(ta.size())
{
if(tb.size())
i = addChar(ta.top(),tb.top(),a,i)?1:0;
else
i = addChar(ta.top(),'0',a,i)?1:0;

ta.pop();
tb.pop();

tr.push(a);
}
if(i)
tr.push('1');

while(tr.size())
{
resualt.value.push(tr.top());
tr.pop();
}
return resualt;
}

#endif //_ADD_H_

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdbool.h> struct bign{ int d[200]; int len; int flag; }; typedef struct bign BigNum; void init(BigNum *a) { memset(a->d,0,sizeof(a->d)); a->len = 0; a-> flag = 1; } BigNum str_to_num(const char str[]) { BigNum res; init(&res); int len = strlen(str); res.len = len; for(int i = 0;i < len;i++) { if(str[len - 1-i] == '-') { res.len --; res.flag = -1; break; } else { res.d[i] = str[len - 1 - i] - '0'; } } return res; } bool is_zero(const BigNum *a) { if(a->len == 1 && a-> d[0] == 0) { return true; } else return false; } //比较绝对值得大小 int bign_cmp(const BigNum *a,const BigNum *b) { if(a->len > b-> len) { return 1; } else if(a->len < b->len) { return -1; } else { for(int i = a-> len-1;i >= 0;i --) { if(a->d[i] > b->d[i]) { return 1; } else if(a->d[i]<b->d[i]) return -1; } } return 0; } //高精度加法 BigNum_add(const BigNum *a,const BigNum *b) { BigNum res; bign(&res); int len; len = (a->len>b->len)?a->len:b->len; for(int i = 0;i < len;i++) { res.d[i] += a->d[i] + b->d[i]; if(res.d[i] >= 10) { res.d[i+1]++; res.d[i] -= 10; } } if(res.d[len] != 0) { len++; } res.len = len; res.flag = 1; return res; } BigNum_sub(BigNum *a,BigNum *b) { BigNum res; bign(&res); int len; if(cmp(a,b) < 0) { BigNum *tmp = a; a =b; b = tmp; res.flag = -1; } else { res.flag = 1; } len = a->len; for(int i = 0;i < len;i++) { if(a->d[i]<b->d[i]) { a->d[i+1]--; a->d[i] +=10; } res.d[i] = a->d[i] - b->d[i]; } while(len > 1 && res.d[len-1] == 0) { len--; } res.len = len; return res; } void print_bignum(const BigNum *a) { if(a->flag<0) { printf("-"); } for(int i = a->len-1;i>=0;i--) { printf("%d",a->d[i]); } printf("\n"); } int main() { char a, b; scanf("%s %s",&a,&b); init(a); BigNum_add(a,b); print_bignum(a); return 0; }完善该段代码
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值