bigint的一些小问题

来源:互联网 发布:mssql数据库管理工具 编辑:程序博客网 时间:2024/06/05 00:31

问题:

1、时间久,消耗内存大。(可能是写了重载?很好奇别人的是不是用>>和<<来输入输出的orz。。应该不是双链表的问题吧0.0)

2、使用双链表的小心得:①head和tail都不要用来放数据就会使插入删除什么的很方便,不搞特殊哈。哦哦还有head和tail不计入结点总数啵!

                                              ②双链表在插入新节点的时候老是忘记->next->next->prev = ->next,以至于回来的那根链条断掉啦!

      ③is>>ch的>>是不会接受\n哒!所以休想用这个句子来使某一时刻ch变成\n以此判断结束条件!休想!你会无限循环哒!

3、嗯嗯node写在外面的话对oj的题会方便很多诶虽然失去了封装性。。

4、如果你很凌乱不知道正在写的DA里面应该有哪些func的话就从main开始写吧!main->node->daclass->implement√

5、记得bigint要倒着存哦!如果用双链表的话就没这种问题啦!总之输入和输出是从不同方向的哦!哦!

6、代码好长好丑嘤嘤嘤



#include <iostream> 
using namespace std;


struct node{
char data;
node *next;
node *prev;
node(const char& x, node* p = NULL, node* n = NULL):data(x),next(n),prev(p){}
node(node* p = NULL, node* n = NULL):next(n),prev(p){}
};


class bigint{
friend istream& operator>>(istream& is, bigint& n);
friend ostream& operator<<(ostream& os, const bigint& n);
friend bigint operator+(const bigint& n1, const bigint& n2);
public:
node *head;
node *tail;
int len;


bigint(){
head = new node;
tail = new node;
head->next = tail;
tail->prev = head;
len = 0;
}


~bigint(){clear(); delete head; delete tail;}


void clear(){
node *tmp = head;
while(tmp->next != tail){
tmp = tmp->next;
delete head;
head = tmp;
}
len = 0;
}


};


int main(){
bigint bn1, bn2;


cin >> bn1;
cin >> bn2;


    bigint bn3 = bn1 + bn2;


cout << bn3;


return 0;
}


istream& operator>>(istream& is, bigint& n){
if(n.len > 0) n.clear();
char ch; bool flag = true;
is.get(ch);//不可以是is>>ch
while(ch >= '0' && ch <= '9'){
if (flag && ch == '0'){ is.get(ch); continue;}//是0的时候is>>ch没改然后还是循环输入
else{
flag = false;
n.head->next = new node(ch, n.head, n.head->next);
n.head->next->next->prev = n.head->next;//你漏了这一行哦!!!
n.len++;
is.get(ch);//不可以是is >> ch否则换行符读不进去会一直在输入状态
}
}
if (flag) {n.head->next = new node('0',n.head, n.head->next); n.head->next->next->prev = n.head->next; n.len++;}
return is;
}


bigint operator+(const bigint& n1, const bigint& n2){
bigint n;
node *p = n1.head->next, *q = n2.head->next, *r = n.head;
int carry = 0, result;


while(p != n1.tail && q != n2.tail){
result = p->data - '0' + q->data - '0' + carry;
carry = result/10;
result = result%10;
r->next = new node( '0'+result, r, r->next);
r->next->next->prev = r->next;//你漏了这句哦!!!
n.len++;
p = p->next;
q = q->next;
r = r->next;
}


while(p != n1.tail){
result = p->data - '0' + carry;
carry = result/10;
result = result%10;
r->next = new node('0' + result, r, r->next);
r->next->next->prev = r->next;
n.len++;
p = p->next;
r = r->next;
}


while(q != n2.tail){
result = q->data - '0' + carry;
carry = result/10;
result = result%10;
r->next = new node('0' + result, r, r->next);
r->next->next->prev = r->next;
n.len++;
q = q->next;
r = r->next;
}


if (carry > 0){
r->next = new node('0'+carry, r, r->next);
r->next->next->prev = r->next;
n.len++;
}
return n;
}


ostream& operator<<(ostream& os, const bigint& n){
    node *tmp = n.tail->prev;
    while(tmp != n.head){
        os << tmp->data;
        tmp = tmp->prev;
    }
    return os;

}



0 0
原创粉丝点击