首页 | 手机版 | 三国演义 | 三国志 | 史将 | 背景 | 藏书阁
首页 -> 精彩文章 -> 我写的最长的程序算诸如(-3)*2+6^27-98/7的表达试的值的

我写的最长的程序算诸如(-3)*2+6^27-98/7的表达试的值的

作者董成城 标签程序 阅读次数:60
#include
#include
#include
#include
typedef vector inttype;
vector shu;
vector fu;
char you[8][8]={{'<','<','<','<','>','e','<','>'},   // +
        {'<','<','<','<','>','e','<','>'},   // -
        {'>','>','<','<','>','e','<','>'},   // *
        {'>','>','<','<','>','e','<','>'},   // /
        {'>','>','>','>','>','e','e','>'},   // (
        {'<','<','<','<','=','e','<','e'},   // )
        {'>','>','>','>','>','e','<','>'},   // ^
        {'e','e','e','e','e','e','e','e'}};   // #
char yun[8] = {'+','-','*','/','(',')','^','#'};
long top=0,i=0;
ifstream fin("D:\\group.txt");
ofstream fout("D:\\answer.txt");
char bijiao(char x,char y);
void jia(vector& ve1,vector& ve2);
void jian(vector& ve1,vector& ve2);
void cheng(vector& ve1,vector& ve2);
void chu(vector& ve1,vector& ve2);
void cifang(vector& ve1,vector& ve2);
void shuan(char ch);
void shuchu(vector& ve);
bool dengjia(vector& ve1,vector& ve2);
//main procedure begins here.
main(){
  char c,w;
  bool b=false;
  fu.push_back('#');
  fin>>c;
  while (c!='#'){
    if (c>='0'&&c<='9'){
      vector tmp;
      tmp.push_back(1);
      while(c>='0'&&c<='9'){
        tmp.push_back(c-'0');
        fin>>c;
      }
      i++;
      shu.push_back(tmp);
      continue;
     }else{
      if (c=='-'&&b){
        vector tmp;
        fin>>c;
        tmp.push_back(-1);
        while(c>='0'&&c<='9'){
          tmp.push_back(c-'0');
          fin>>c;
        }
        i++;
        shu.push_back(tmp);
        fu.pop_back();
        top--;
        fin>>c;
        continue;
       }
      b=(c=='(') ? true:false;
      w=fu[top];
      while (bijiao(c,w)=='<'){
        shuan(w);
        top--;
        w=fu[top];
        fu.pop_back();
      }
      if (bijiao(c,w)=='>'){
        top++;
        fu.push_back(c);
        fin>>c;
        continue;
      }
      if (bijiao(c,w)=='='){
        fu.pop_back();
        top--;
        fin>>c;
        continue;
      }
     }
  }
  fin.close();
  w=fu[top];
  while (w!='#'){
    shuan(w);
    top--;
    w=fu[top];
  }
  shuchu(shu[0]);
  fout.close();
}
//main procedure ends here.
//bijiao procedure here it returns two operators you xian ji
char bijiao(char x,char y){
   int i=0,j=0;
   while (yun[i]!=x) i++;
   while (yun[j]!=y) j++;
   return you[i][j];
}
//deng jia function here it compares two vector
bool dengjia(vector& ve1,vector& ve2){
   int c1,c2,j,i;
   c1=ve1.size()-1;
   c2=ve2.size()-1;
   if (c1!=c2) return false;
     else{
      for(i=0;((ve1[i]==ve2[i])&&(i      if ((ve1[i]==ve2[i])&&(i==c1)) return true;
       else return false;
      }
}
//shu chu here it shu chu the final answer
void shuchu(vector& ve){
   int i,j=ve.size();
   if (ve[0]==-1) fout<<'-';
   for (i=1;i<=j-1;i++) fout<}
//jia fa here it adds two numbers
void jia(vector& ve1,vector& ve2){
   int c1,c2,j,i,c,d;
   vector v,tmp;
   c1=ve1.size()-1;
   c2=ve2.size()-1;
   d=(c1   c=(c1>c2)?c1:c2;
   j=0;
   if(ve1[0]*ve2[0]<0){ //yi hao
    if (ve1[0]==-1){
      ve1[0]=1;
      jian(ve1,ve2);
      ve1[0]*=-1;
    }else{
      ve2[0]=1;
      jian(ve1,ve2);
    }
   }else{        //tong hao
      v.push_back(ve1[0]);
      while((c!=0)&&(d!=0)){
       v.push_back((ve1[c1]+ve2[c2]+j)%10);
       j=(ve1[c1]+ve2[c2]+j)/10;
       c--;  d--; c1--; c2--;
      }
      if (ve1.size()       while ((j!=0)&&(c>0)){
         v.push_back((ve2[c]+j)%10);
         j=(ve2[c]+j)/10;
         c--;
       }
       if (c>0) for (;c>0;c--) v.push_back(ve2[c]);
       else v.push_back(j);
      }else if(ve1.size()>ve2.size()){
       while ((j!=0)&&(c>0)){
         v.push_back((ve1[c]+j)%10);
         j=(ve1[c]+j)/10;
         c--;
       }
       if (c>0) while (c>0){
             v.push_back(ve1[c]);
             c-- ;
            }
       else v.push_back(j);
      }else if (j!=0) v.push_back(j);
      i=v.size()-1; tmp.push_back(v[0]);
      while (i>0){
       tmp.push_back(v[i]);
       i--;
      }
      ve1=tmp;
   }
}
//jian fa here
void jian(vector& ve1,vector& ve2){
   int c1,c2,j,i;
   bool big;
   vector tmp;
   c1=ve1.size()-1;
   c2=ve2.size()-1;
   if(ve1[0]*ve2[0]<0){     //yi hao
    if (ve1[0]==-1){
      ve2[0]=-1;
      jia(ve1,ve2);
    }else{
      ve2[0]=1;
      jia(ve1,ve2);
    }
   }else{            //tong hao
    if (c1>c2) big=true;   //bi jiao da xiao
     else if (c1      else{
      for(i=1;ve1[i]==ve2[i];i++);
      if (ve1[i]>ve2[i]) big=true;
       else big=false;
      }
    if (big){         //ve1 is larger
       i=c1;  j=c2;
       while (j>0){
        if (ve1[i]>=ve2[j]) ve1[i]-=ve2[j];
         else{
           int it=i-1;
           while (ve1[it]==0) it--;
           ve1[it]--;  it++;
           while(it             ve1[it]=9;
             it++;
           }
           ve1[i]=ve1[i]+10-ve2[j];
         }
         i--;  j--;
      }
     }else{         // ve2 is larger
       i=c1;  j=c2;
       while (i>0){
        if (ve2[j]>=ve1[i]) ve2[j]-=ve1[i];
        else{
          int it=i-1;
          while (ve2[it]==0) i--;
          ve2[it]--; it++;
          while(it            ve2[it]=9;
            it++;
          }
          ve2[j]=ve2[j]+10-ve1[i];
        }
        i--; j--;
       }
       ve1=ve2;  ve1[0]*=-1;
     }
   }
   j=ve1.size()-1;
   i=1;
   while((ve1[i]==0)&&(i   tmp.push_back(ve1[0]);
   if ((i==j)&&(ve1[i]==0)){
    tmp[0]=1; tmp.push_back(0);
   }else for (;i<=j;i++) tmp.push_back(ve1[i]);
   ve1=tmp;
}
//cheng  fa here
void cheng(vector& ve1,vector& ve2){
   int c1,c2,i,t;
   vector vt,tmp;
   c1=ve1.size()-1;
   c2=ve2.size()-1;
   tmp.push_back(1);
   for (t=c2;t>0;t--){
    int ct=ve2[t],it,j=0;
    vector v,tmp2;
    v.push_back(1);
    for (int in=0;in    for(it=c1;it>0;it--){
      v.push_back((ve1[it]*ct+j)%10);
      j=(ve1[it]*ct+j)/10;
    }
    if (j!=0) v.push_back(j);
    tmp2.push_back(1);
    for (it=v.size()-1;it>0;it--) tmp2.push_back(v[it]);
    jia(tmp,tmp2);
   }
   vt.push_back(ve1[0]*ve2[0]);      //copy and drop 0
   t=tmp.size()-1;
   for (i=1;((tmp[i]==0)&&(i   if ((i==t)&&(tmp[i]==0)){
    vt[0]=1; vt.push_back(0);
   }else while (i<=t){
    vt.push_back(tmp[i]); i++;
   }
   ve1=vt;
}
//chu fa here
void chu(vector& ve1,vector& ve2){
   vector v,tmp,tmp2;
   int it;
   it=(ve1[0]*ve2[0]>0)?1:-1;
   v.push_back(1);
   v.push_back(0);
   tmp.push_back(1);
   tmp.push_back(1);
   ve1[0]=1; ve2[0]=1;
   jian(ve1,ve2);
   while (ve1[0]==1){
     tmp2=ve2;
     jian(ve1,tmp2);
     jia(v,tmp);
   }
   ve1=v;  ve1[0]=it;
}
//cheng fang here
void chengfang(vector& ve1,vector& ve2){
   vector v,tmp,tmp2;
   tmp2=ve1;
   v.push_back(1);
   v.push_back(1);
   tmp.push_back(1);
   tmp.push_back(1);
   while (!dengjia(v,ve2)){
     cheng(ve1,tmp2);
     jia(v,tmp);
   }
}
//shuan here
void shuan(char ch){
   i--;
   switch(ch){
    case '+' :  jia(shu[i-1],shu[i]);
           break;
    case '-' :  jian(shu[i-1],shu[i]);
           break;
    case '*' :  cheng(shu[i-1],shu[i]);
           break;
    case '/' :  chu(shu[i-1],shu[i]);
           break;
    case '^' :  chengfang(shu[i-1],shu[i]);
           break;
   }
   shu.pop_back();
}


浙ICP备06020153号-1