【数据结构】链表实现的高进度加减乘
来源:互联网 发布:html超链接调用js函数 编辑:程序博客网 时间:2024/05/01 00:04
<pre class="cpp" name="code">#include "number.h"#include <cstring>#include "Lstack.h"void number::del(){ moveToStart(); int t = zs_len; for(int i = 0;i<zs_len;i++) { if(getValue()=='0') { head = head->next; t--; print(); } if(getValue()!='0') {break;} } // print(); moveToStart(); if(getValue()=='.') {insert('0');t++;} zs_len = t;// print(); //cout<<zs_len<<endl; //cout<<zs_len; if(zs_len+1==length()) return; moveToStart(); for(int i =0;i<zs_len+1;i++) next(); //cout<<"##\n"; LStack<char> sta; while (curr->next != NULL){ sta.push(remove()); } while ((sta.length()!=0)&&(sta.topValue() == '0')) {sta.pop();} xs_len = sta.length(); while(!sta.isEmpty()) insert(sta.pop()); // cout<<zs_len<<" "<<xs_len<<endl;}void number::input(){ char *p; p = new char[1000]; cin>>p; int len = strlen(p); bool have_dot = false ; for(int i = 0; i<len; i++) { if(p[i]=='.'){zs_len = i;have_dot =true;} append(p[i]); } // cout<<(tail->next==NULL)<<endl; if(have_dot) xs_len = length()-zs_len-1; else{ xs_len = 0; zs_len = length(); append('.'); } //del0(); //print();}number::number(const number& num){ clear(); zs_len = num.zs_len; xs_len = num.xs_len; Link<char> *tmp = num.head->next; while(tmp !=NULL) { append(tmp->element); tmp=tmp->next; }}number& number::operator=(const number& num){ clear(); zs_len = num.zs_len; xs_len = num.xs_len; Link<char> *tmp = num.head->next; while(tmp !=NULL) { append(tmp->element); tmp=tmp->next; } return *this;}number number::operator+(number& num){ number result; int max_xs = xs_len>num.xs_len?xs_len:num.xs_len; //int max_zs = zs_len>num.zs_len?zs_len:num.zs_len; moveToStart(); num.moveToStart(); LStack<char> sta0; for(int i=0;i<zs_len+1;i++) next(); for(int i=0;i<num.zs_len+1;i++) num.next(); int carry = 0; { LStack<char> sta1; LStack<char> sta2; for(int i=0;i<max_xs;i++) { if(curr!=tail){ sta1.push(getValue());//cout<<getValue(); next();} else sta1.push('0'); if(num.curr!=num.tail){ sta2.push(num.getValue());//cout<<num.getValue(); num.next();//cout<<(num.curr==NULL)<<endl; } else sta2.push('0'); } while(!(sta1.isEmpty()||sta2.isEmpty())) { int t =sta1.pop()+sta2.pop()-'0'-'0'+carry; carry = t/10; sta0.push(t%10+'0'); } } LStack<char> sta; { LStack<char> sta1; LStack<char> sta2; moveToStart();num.moveToStart(); for(int i=0;i<zs_len;i++) { char ch =getValue(); sta1.push(ch); next(); } for(int i=0;i<num.zs_len;i++) { sta2.push(num.getValue()); num.next(); } while(!(sta1.isEmpty()||sta2.isEmpty())) { int t =sta1.pop()+sta2.pop()-'0'-'0'+carry; carry = t/10; sta.push(t%10+'0'); } while(!sta1.isEmpty()) { int t =sta1.pop()-'0'+carry; carry =t/10; sta.push(t%10+'0'); } while(!sta2.isEmpty()) { int t =sta2.pop()-'0'+carry; carry =t/10; sta.push(t%10+'0'); } if(carry!=0) sta.push(carry+'0'); } while(!sta.isEmpty()) result.append(sta.pop()); result.append('.'); while(!sta0.isEmpty()) result.append(sta0.pop()); // result.del(); return result;}number number::operator-(number& num){ number result; moveToStart();num.moveToStart(); if(zs_len<num.zs_len) { result = num - *this; result.moveToStart(); result.insert('-'); return result; } if(zs_len==num.zs_len) { int check =0; int i = 0; for(i=0;i<length()&&i<num.length();++i) { if(getValue()>num.getValue()) break; if(getValue()<num.getValue()) { check = 1; break; } next();num.next(); } if((i==length())&&(i!=num.length())) check = 1; if(check) { result = num - *this; result.moveToStart(); result.insert('-'); return result; } } int max_xs = xs_len>num.xs_len?xs_len:num.xs_len; //int max_zs = zs_len>num.zs_len?zs_len:num.zs_len; moveToStart(); num.moveToStart(); int carry = 0; LStack<char> sta0; { for(int i=0;i<zs_len+1;i++) next(); for(int i=0;i<num.zs_len+1;i++) num.next(); LStack<char> sta1; LStack<char> sta2; for(int i=0;i<max_xs;i++) { if(curr!=tail){ sta1.push(getValue());//cout<<getValue(); next();} else sta1.push('0'); if(num.curr!=num.tail){ sta2.push(num.getValue());//cout<<num.getValue(); num.next();//cout<<(num.curr==NULL)<<endl; } else sta2.push('0'); } while(!(sta1.isEmpty()||sta2.isEmpty())) { int t =sta1.pop()-sta2.pop()+carry; if(t<0) { t+=10; carry = -1; sta0.push(t+'0'); } else { carry = 0; sta0.push(t+'0'); } } } LStack<char> sta; { LStack<char> sta1; LStack<char> sta2; moveToStart();num.moveToStart(); for(int i=0;i<zs_len;i++) { char ch =getValue(); sta1.push(ch); next(); } for(int i=0;i<num.zs_len;i++) { sta2.push(num.getValue()); num.next(); } while(!(sta1.isEmpty()||sta2.isEmpty())) { int t =sta1.pop()-sta2.pop()+carry; if(t<0) { t+=10; carry = -1; sta.push(t+'0'); } else { carry = 0; sta.push(t+'0'); } } while(!sta1.isEmpty()) { int t =sta1.pop()-'0'+carry; if(t<0) { t+=10; carry = -1; sta.push(t+'0'); } else { carry = 0; sta.push(t+'0'); } } while(!sta2.isEmpty()) { int t =sta2.pop()-'0'+carry; if(t<10) { t+=10; carry = -1; sta.push(t+'0'); } else { carry = 0; sta.push(t+'0'); } } } while(!sta.isEmpty()) result.append(sta.pop()); result.append('.'); while(!sta0.isEmpty()) result.append(sta0.pop()); result.del(); return result;}number number::operator*(number& num){ number result; reverse(); num.reverse(); // num.print(); int i; // 先全部插入零 for (i = 0; i < (zs_len+xs_len+num.zs_len+num.xs_len); i++){ result.insert('0'); } // cout<<"###"<<endl; Link<char> *cur = result.head->next; num.moveToStart(); while (num.curr->next != NULL){ // 每一位进行相乘 if (num.curr->next->element == '.') { num.next(); continue; } int carry = 0; result.curr = cur; moveToStart(); while (curr->next != NULL){ if (curr->next->element == '.') { next(); continue; } int t = result.curr->element - '0'; t += (getValue() - '0') * (num.getValue() - '0') + carry; carry = t / 10; result.curr->element = t % 10 + '0'; result.next(); next(); } while (result.curr != NULL){ int t = result.curr->element - '0' + carry; carry = t / 10; result.curr->element = t % 10 + '0'; result.curr = result.curr->next; } num.next(); cur = cur->next; } result.moveToPos(xs_len + num.xs_len); // 添上小数点 result.insert('.'); // result.print(); result.reverse(); // result.print(); reverse(); num.reverse(); // cout<<"###"<<endl; result.del0(); // result.print(); // cout<<"###"<<endl; return result;}number number::chengfang(int n){ number result = *this; while(n>1) { // cout<<n<<endl; result = result * (*this); n--; //result.print(); // cout<<n<<endl; } //result.del(); return result;}void number::del0(){ reverse(); int i = 0; moveToStart(); while (getValue() == '0') remove(); while (getValue() != '.'){ next(); i++; } xs_len = i; moveToStart(); LStack<char> st; while (curr->next != NULL){ st.push(remove()); } while (st.topValue() == '0') st.pop(); if (st.topValue() == '.') st.push('0'); while (st.length() > 0) insert(st.pop()); zs_len = length() - 1 - i; reverse();}void number::display(){ curr = head; while(curr->next!=tail) { cout<<curr->next->element; curr = curr->next; } if(tail->element!='.') cout<<tail->element; cout<<endl;}
#include <iostream>#include "number.h"#include "Llist.h"using namespace std;int main(){ number A,B,C;int n; cout<<"===================================================\n" <<"= calculator =\n" <<"===================================================\n"; cout<<"\n\nInput two positive number A and B, we will give you A+B, A-B, A*B.\n\n\nA :";A.input(); cout<<"B: ";B.input(); cout<<"A+B: ";(A+B).display(); cout<<"A-B: ";(A-B).display(); cout<<"A*B: ";(A*B).display(); cout<<"===================================================\n\n\n"; cout<<"Input a positive number C and a integer n,we will give C^n.\nC: ";C.input(); cout<<"n: ";cin>>n; cout<<"C^n: ";C.chengfang(n).display(); return 0;}
以下是链表存储的数字number.h.
#ifndef NUMBER_H_INCLUDED#define NUMBER_H_INCLUDED#include "Llist.h"#include "Lstack.h"
class number :public Llist<char>{ private: int zs_len; int xs_len; void del(); void del0(); public:
void input(); void display(); number(){zs_len=xs_len=0;} number& operator=(const number& num); number(const number& num); number operator+(number& num); number operator-(number& num); number operator*(number& num); number chengfang(int n);};
#endif // NUMBER_H_INCLUDED
#ifndef LLIST_H_INCLUDED#define LLIST_H_INCLUDED#include<iostream>using namespace std;template <typename E>class Link{ private: static Link<E>* freelist; public: E element; Link* next; Link(const E elem,Link *n=NULL) { element = elem; next = n; } Link(Link *n=NULL) { next = n; }};////////////////////////////////////////////////////////////////////////////////////////template <typename E>class Llist{private:// int cnt; void initial() { curr=head=tail=new Link<E>; cnt=0; } void removeall() { while(head!=tail) { curr = head; head = head->next; delete curr; } }public: Link<E>* head; Link<E>* tail; Link<E>* curr;Llist(int size = 0){initial();}~Llist(){removeall(); } void print() { curr = head; while(curr!=tail) { cout<<curr->next->element; curr = curr->next; } cout<<endl; }void clear(){//reinitialize the list removeall();initial();}void insert(const E& it){ curr->next = new Link<E>(it,curr->next);//具体实现要看Link这个类里面的语法 if (tail==curr) tail = curr->next; cnt++;}void append(const E& it){ tail=tail->next=new Link<E> (it,NULL); cnt++;} E remove() { E it =curr->next->element; Link<E> *temp =curr->next; if (tail ==curr->next) tail= curr; curr->next=temp->next; delete temp; cnt--; return it ;}void moveToStart(){curr =head;}void moveToEnd(){curr=tail;}void prev(){ if (curr==head) return; Link<E>* temp =head; while(temp->next!=curr) temp = temp ->next; curr=temp;} void reverse()//create a new list and move every element from the second element from the orginal list to new head->next { Link<E>* tmp = head->next; Link<E> *ptr,*r; Link<E>* t = tail; r = t->next = new Link<E>(tmp->element); tmp = tmp->next; while (tmp!=tail->next){ ptr = new Link<E>(tmp->element,t->next); //cout<<ptr->element; t->next = ptr; delete head; head = head->next; tmp =tmp->next; // cout<<"##\n"; } head = tail; tail = r; }void next(){curr=curr->next;}int length()const{ return cnt;}int currPos()const{ Link <E> *temp=head; int i; for(i=0;curr!=temp;i++) { temp=temp->next; } return i;}void moveToPos(int pos){ curr=head; for(int i =0;i<pos;i++) curr=curr->next;}const E& getValue()const{ return curr->next->element;} E maxValue() { curr = head ->next; E max = curr->element; while(curr!=NULL) { if(curr->element>max) max = curr->element; curr = curr->next; } return max; }};#endif // LLIST_H_INCLUDED
#ifndef LSTACK_H_INCLUDED#define LSTACK_H_INCLUDED//template <typename E>//class Link//{// public:// E element;// Link<E> *next;// Link(E it,Link<E>* n = NULL)// {// element = it;// next = n;// }//};template <typename E>class LStack{ template <typename U> struct Link { E element; Link<U> *next; Link(U it,Link<U>* n = NULL) { element = it; next = n; } }; private: Link<E> *top; int size; public: LStack(){top=NULL;size = 0;} ~LStack() { delete top; } //reclaim all the space used by the stack element void clear() { while(top!=NULL) { Link<E> *tmp =top; top = top->next; delete tmp; } size = 0; } //push an element on the top of the stack void push(const E &it) { top = new Link<E>(it,top); size++; } //remove the top element of the stack and return it E pop() { E it = top->element; Link<E> *temp = top; top= top->next; delete temp; size--; return it; } //get the top value const E& topValue() const { return top->element; } //return the number of the elements in the stack int length() const { return size; } bool isEmpty() { return (size==0); }};#endif // LSTACK_H_INCLUDED
0 0
- 【数据结构】链表实现的高进度加减乘
- 数据结构 —— 链表实现多项式加减乘
- 链表实现多项式的加减乘求导
- 大数的加减乘阶乘,java实现
- 链表多项式的基本运算加减乘
- 多项式的加减乘
- java通过矩阵类实现矩阵的加减乘运算
- c++实现大数的加减乘运算(数组存放)
- bigInt的加减乘函数
- BigDecimal的加减乘除法
- 实现一个三维矢量库,完成矢量之间的加减、点乘,叉乘
- 链表操作——多项式加减乘
- Java 用单链表实现多项式加减乘
- 多项式加减乘除法算法实现
- 求两个复数的加减乘
- 大整数的加减乘运算
- 三、向量的加减乘除法
- 一元多项式的加减乘运算
- Java类加载机制深度分析
- C#多线程详细讲解2
- 2013 Asia Regional Changchun 解题报告
- MySQL的not null default
- 第十周项目3:血型统计
- 【数据结构】链表实现的高进度加减乘
- Axis 2 整合到 SSH 项目,Axis2 整合,Axis2 发布,Axis2 部署方法及遇到问题
- linux ps命令输出进程号
- Androidi清理内存
- 今天在bctc碰到一个韩国姑娘,皮肤好好,还碰到一个跟俺一样中午刷牙的姑娘。
- HDU 3804 Query on a tree (树链剖分)
- Java的HashMap和HashTable
- 小试牛刀
- Mysql 安装(Using Generic Binaries)