#12078: C語言解答


forever84721 (廖翊傑)

學校 : 國立勤益科技大學
編號 : 50169
來源 : [61.31.169.97]
最後登入時間 :
2023-02-22 17:19:46
a017. 五則運算 | From: [101.10.66.216] | 發表日期 : 2017-05-26 16:07

沒用到甚麼技巧 大家參考看看囉

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. char ch[100000],sym[1000];
  4. int num[1000],i,j,k,symindex,numindex,lindex,l[100];
  5. int main(int argc, char *argv[])
  6. {
  7.     while(gets(ch)!=NULL)
  8.     {
  9.         symindex=0,numindex=0,lindex=0;
  10.         memset(num,0,sizeof(num));
  11.         memset(l,0,sizeof(l));
  12.         memset(sym,' ',sizeof(sym));
  13.         for(i=0;i<strlen(ch);i++)
  14.         {
  15.             if(ch[i]==' ')
  16.             {
  17.                 continue;
  18.             }
  19.             if(ch[i]>='0'&&ch[i]<='9')
  20.             {
  21.                 num[numindex]=num[numindex]*10+(ch[i]-48);
  22.                 if(ch[i-1]=='-')
  23.                 {
  24.                     num[numindex]*=-1;
  25.                 }
  26.                 if(ch[i+1]==' ')
  27.                 {
  28.                     numindex++;
  29.                 }
  30.             }
  31.             if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/'||ch[i]=='%'||ch[i]=='('||ch[i]==')')
  32.             {
  33.                 switch(ch[i])
  34.                 {
  35.                     case '+':  
  36.                     case '-':
  37.                     case '*':
  38.                     case '/':
  39.                     case '%':
  40.                         if(ch[i+1]==' ')
  41.                         {
  42.                             sym[symindex]=ch[i];
  43.                             symindex++;
  44.                         }
  45.                         break;
  46.                     case '(':
  47.                         l[lindex]=symindex;
  48.                         lindex++;
  49.                         break;
  50.                     case ')':
  51.                         Calculation(l[lindex-1]);
  52.                         lindex--;
  53.                         break;
  54.                 }  
  55.             }  
  56.         }
  57.         Calculation(0);
  58.         printf("%d\n",num[0]); 
  59.     }
  60.     return 0;
  61. }
  62. void Calculation(int start)
  63. {
  64.     for(j=start;j<=symindex;j++)
  65.     {
  66.         switch(sym[j])
  67.         {
  68.             case '*':
  69.                 num[j]*=num[j+1];
  70.                 for(k=j+1;k<=numindex;k++)
  71.                 {
  72.                     num[k]=num[k+1];
  73.                     sym[k-1]=sym[k];
  74.                 }
  75.                 j--;
  76.                 numindex--;
  77.                 symindex--;
  78.                 break;
  79.             case '/':
  80.                 num[j]/=num[j+1];
  81.                 for(k=j+1;k<=numindex;k++)
  82.                 {
  83.                     num[k]=num[k+1];
  84.                     sym[k-1]=sym[k];
  85.                 }
  86.                 j--;
  87.                 numindex--;
  88.                 symindex--;
  89.                 break;
  90.             case '%':
  91.                 num[j]%=num[j+1];
  92.                 for(k=j+1;k<=numindex;k++)
  93.                 {
  94.                     num[k]=num[k+1];
  95.                     sym[k-1]=sym[k];
  96.                 }
  97.                 j--;
  98.                 numindex--;
  99.                 symindex--;
  100.                 break;
  101.         }
  102.     }
  103.     for(j=l[lindex-1];j<=symindex;j++)
  104.     {
  105.         switch(sym[j])
  106.         {
  107.             case '+':
  108.                 num[j]+=num[j+1];
  109.                 for(k=j+1;k<=numindex;k++)
  110.                 {
  111.                     num[k]=num[k+1];
  112.                     sym[k-1]=sym[k];
  113.                 }
  114.                 j--;
  115.                 numindex--;
  116.                 symindex--;
  117.                 break;
  118.             case '-':
  119.                 num[j]-=num[j+1];
  120.                 for(k=j+1;k<=numindex;k++)
  121.                 {
  122.                     num[k]=num[k+1];
  123.                     sym[k-1]=sym[k];
  124.                 }
  125.                 j--;
  126.                 numindex--;
  127.                 symindex--;
  128.                 break;
  129.         }
  130.     }
  131. }
 
ZeroJudge Forum