去年写的一个大整数四则运算课设,现在自己竟然忘得一干二净了,也不知道再次写还能不能写出来,真是悲催
当时老师要求真变态,不能用系统自带的栈,数组去存数,必须自己写个栈和用链表去存大数
main:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<map> #include<iomanip> #include<ctype.h> #include"calculate.h" #define INF 99999999 using namespace std; const int MAX=10; typedef struct stack{ int *date;//存大数 char ch; int mark;//mark用来标记符号:正负 stack *next; stack(){ next=NULL,mark=1; } }; typedef struct head{ stack *top; int size; head(){ top=NULL,size=0; } void push(stack* &p); void Clear(); void Pop(); }; head stack_dou,stack_ch;//一个用来存数字,一个用来存运算符. void output(stack* &p){ cout<<"结果是:"; int l=p->date[0]; if(p->date[l] != 0 && p->mark == -1)cout<<"-"; cout<<p->date[l]; for(int i=l-1;i>=1;--i)cout<<setfill('0')<<setw(4)<<p->date[i]; cout<<endl; } bool isoperator(char s){//判断运算符s是否符合条件. if(s == '+' || s == '-' || s == '*' || s == '/' || s == '(' || s == ')')return true; return false; } void head::push(stack* &p){//元素入栈. p->next=this->top; this->top=p; this->size++; } void head::Pop(){//删除栈顶元素. stack *p=this->top; this->top=this->top->next; this->size--; delete p; } void head::Clear(){//清空栈. while(this->top){ stack *p=this->top; this->top=this->top->next; delete p; } this->size=0; } bool stack_dou_calculate(char s){//s代表运算符,对实数栈的栈顶两个元素进行运算. if(stack_dou.size<2)return false; int *second=stack_dou.top->date,mark2=stack_dou.top->mark; stack_dou.top->date=NULL;stack_dou.Pop(); int *first=stack_dou.top->date,mark1=stack_dou.top->mark; stack_dou.top->date=NULL;stack_dou.Pop(); int *sum=new int[100]; if(s == '+' && mark1*mark2 == 1 || (s == '-' && mark1*mark2 == -1))add(first,second,sum);//相加 if(s == '-' && mark1*mark2 == 1){//相减 if(cmp(first,second))sub(first,second,sum); else {sub(second,first,sum);mark1=-1*mark2;} } if(s == '+' && mark1*mark2 == -1){//相减 if(cmp(first,second))sub(first,second,sum); else {sub(second,first,sum);mark1=mark2;} } if(s == '*')mult(first,second,sum);//相乘 if(s == '/')div(first,second,sum);//相除 stack *p=new stack; p->date=sum; p->mark=mark1; stack_dou.push(p); delete first; delete second; return true; } bool cmp(char a,char b){//比较运算符a,b的优先级. if(b == '+' || b == '-' || a== '*' || a == '/' || b == ')' || a == '(')return true; return false; } void calculate(string s){//计算表达式s. string a; for(int i=0;i<s.size();++i){ if(s[i] == ' '){if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();}continue;} if(isdigit(s[i]))a+=s[i]; else if(isoperator(s[i])){ if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();} while(stack_ch.top && cmp(stack_ch.top->ch,s[i])){ if(stack_ch.top->ch != '('){ if(!stack_dou_calculate(stack_ch.top->ch))break; stack_ch.Pop(); } else {stack_ch.Pop();break;} } if(s[i] != ')'){stack *p=new stack;p->ch=s[i];stack_ch.push(p);} } else{cout<<"输入错误,请重输!\n";return;} } if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();} while(stack_ch.top){ if(!stack_dou_calculate(stack_ch.top->ch))break; stack_ch.Pop(); } if(stack_dou.size == 1 && stack_ch.size == 0) output(stack_dou.top); else cout<<"输入错误,请重输!\n"; } int main(){ string s; cout<<"请输入表达式:"; while(getline(cin,s)){//输入表达式s. calculate(s);//计算表达式s. stack_dou.Clear();//清空实数栈. stack_ch.Clear();//清空字符栈. cout<<"请输入表达式:"; } return 0; } /* 2+3*4+5 2222222222222222222222222222222222222+1111111111111111111111111111111111 22222222222222222222222222222222*444444444444444444444444444444444 1111111111111111111111111111111111111111111111111111111111111111111111111*10000000000000000000000000000000000000000000 999999999999999999999999999999999999-888888888888888888888+7777777777777777/2222222222222 66666666666666666666666666666666666666/2222222 (2+3)*100000000000000000000000000000000000000 1111-22222222222222222222222 1-2+3*6-(2+4) 5+6/9*7/2 */head:
#include<cstring> #include<string> using namespace std; //****************************************************************************** const int Base=10000,seg=4; //****************************************************************************** void trans(string ch,int *s){//将字符串转化为数字 int i,k=1; int L=ch.size()-seg; for(i=L;i>=0;i-=seg,k++){//从字符串后面开始,依次四位四位存入整型数组. s[k]=ch[i]-'0'; for(int j=i+1;j<i+seg;++j){ s[k]=s[k]*10+ch[j]-'0'; } } i+=seg; s[k]=0; for(int j=0;j<i;++j){ s[k]=s[k]*10+ch[j]-'0'; } if(s[k])s[0]=k;//s[0]储存该数组的位数. else s[0]=k-1; } //****************************************************************************** void add(int *A,int *B,int *sum){//大整数相加 int la=max(A[0],B[0]),i,c=0; for(int i=A[0]+1;i<=la;++i)A[i]=0; for(int i=B[0]+1;i<=la;++i)B[i]=0; for(i=1;i<=la;++i){ sum[i]=A[i]+B[i]+c; if(sum[i]>=Base){ c=sum[i]/Base; sum[i]%=Base; }else c=0; } if(c>0){ sum[i]=c; sum[0]=i; } else sum[0]=i-1; } //****************************************************************************** void sub(int *A,int *B,int *sum){//大数相减 int c=0; for(int i=B[0]+1;i<=A[0];++i)B[i]=0; for(int i=1;i<=A[0];++i){ sum[i]=A[i]-B[i]+c; if(sum[i]<0){ sum[i]+=Base; c=-1; }else c=0; } sum[0]=1; for(int i=A[0];i>=1;--i){ if(sum[i]){ sum[0]=i; break; } } } //****************************************************************************** void mult(int *A,int *B,int *sum){//大整数相乘 int i,j,k; int all=A[0]+B[0]-1; memset(sum,0,sizeof(int)*(all+3)); for(i=1,k=1;i<=A[0];++i){ k=i; if(A[i]){ for(j=1;j<=B[0];++j,++k){ sum[k]+=A[i]*B[j]; if(sum[k]>=Base){ sum[k+1]+=sum[k]/Base; sum[k]=sum[k]%Base; } } } } while(sum[k]>=Base){ sum[k+1]+=sum[k]/Base; sum[k]=sum[k++]%Base; } if(!sum[k])k--; sum[0]=k; } //****************************************************************************** //比较a,b的大小 bool cmp(int *a,int *b){ if(a[0]>b[0])return true; if(a[0]<b[0])return false; for(int i=a[0];i>=1;--i){ if(a[i]>b[i])return true; if(a[i]<b[i])return false; } return true; } //比较a从第t个位置开始和b的大小 int cmp(int *a,int *b,int t){ int i,j=1; for(i=b[0];i>=1;--i,++j){ if(a[t]>b[i])return j; if(a[t]<b[i])return -1; --t; } return 0; } void copy(int *a,int *b){ a[0]=b[0]; for(int i=1;i<=a[0];++i)a[i]=b[i]; } int zero[]={1,0}; //sum=a/b,r=a%b void div(int *a,int *b,int *sum/*,int *r*/){//大整数除法 int m=a[0],n=b[0]; int Base1000=Base*1000,Base100=Base*100,Base10=Base*10; if(!cmp(a,b)){ /*copy(r,a),*/copy(sum,zero); return; } int k=m-n+1; for(int i=k;i>=0;--i)sum[i]=0; for(int i=k,t=m;i>=1,t>=n;){ int p=cmp(a,b,t);//a[t]-b[n] if(p<0 && t == n)break; if(p == 0){ sum[i]++; for(int j=t;j>=t-n+1;--j)a[j]=0; t-=n; if(t<n)break; i-=n; } if(p>1){ sum[i]++; for(int j=t,q=n;j>=t-n+1;--j,--q)a[j]-=b[q]; for(int j=t-n+1;j<=t;++j){ if(a[j]<0){ a[j]+=Base,a[j+1]--; } } int j; for(int j=t;j>=t-n+1;--j)if(a[j])break; if(j<n)break; i-=(t-j); t=j; } if(p<0 && t>n){ a[t-1]+=a[t]*Base; a[t]=0; --t; --i; } if(p == 1){ int x=a[t]/(b[n]+1); sum[i]+=x; for(int j=t,q=n;q>=1;--q,--j)a[j]-=x*b[q]; for(int j=t-n+1;j<=t;++j){ while(a[j]<=-Base1000){a[j]+=Base1000,a[j+1]-=1000;} while(a[j]<=-Base100){a[j]+=Base100,a[j+1]-=100;} while(a[j]<=-Base10){a[j]+=Base10,a[j+1]-=10;} while(a[j]<=0){a[j]+=Base,a[j+1]-=1;} } } } if(sum[k] == 0)sum[0]=k-1;else sum[0]=k; /*int i; for(i=m;i>=1;--i)if(a[i])break; if(i == 0)copy(r,zero); else{ r[0]=i; while(i >= 1)r[i]=a[i--]; }*/ }