csp練題記錄(C語言,編譯器dev c++)201903-2二十四點

csp練題記錄(C語言,編譯器dev c++)201903-2二十四點

一、題目描述

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

二、思路分析

這道題着實讓我困擾了很久,看了好多博文,大佬們編寫的代碼感覺太深了,渣渣模仿不來啊(關鍵還是練得少,基礎不紮實。。。)
首先,怎麼接收輸入的表達式呢?將它視爲字符串接收,隨即調用判斷函數進行判斷,輸出結果。
接着說判斷函數,表達式分成兩部分:算數和算符。由於接收的是字符型的,故算數那要進行-‘0’,ASCII碼嘛。算符的話只是我們進行何種運算的一個判斷,所以不用進行-‘0’操作。
接着,先進行乘除運算,放在前邊,執行順序也就體現了運算的優先級順序,算完以後,將後邊的算符和算數依次前移,這是由於考慮到了連乘、連除的情況。

三、代碼實現

#include<stdio.h>
int judge(char s[])
{
 int a[4],i,j;
 char op[3];
 //提取算數和算符
 for(i = 0; i < 4; i++)
        a[i] = s[i * 2] - '0';
    for(i = 0; i < 3; i++)
        op[i] = s[i * 2 + 1];
 int k=3;//總共計算3次
 for(i=0;i<k;i++)//先乘除 
 {
  if(op[i]=='x'||op[i]=='/')
  {
   if(op[i]=='x')
    a[i]=a[i]*a[i+1];
   else
    a[i]=a[i]/a[i+1];
   for(j=i+1;j<k;j++)//算符、算數前移
   {
    op[j-1]=op[j];
    a[j]=a[j+1];
   }
   k--,i--; 
  }
 }
 int ans=a[0];
 for(i=0;i<k;i++)//後加減
 {
  if(op[i]=='+')
  {
   ans=a[i]+a[i+1];
   a[i+1]=ans;
  }
  else
  {
   ans=a[i]-a[i+1];
   a[i+1]=ans;
  }
 }
 return ans;
}
int main()
{
 int n;
 char exp[8];
 scanf("%d",&n);
 while(n--)// 
 {
  scanf("%s",exp);
  printf(judge(exp)==24?"Yes\n":"No\n");
 }
 return 0;
}

四、反思總結

for(int i=0;i<n;i++)的寫法不標準,會判爲編譯出錯。
最大的疑問,如果提取算符和算數那一步改成以下形式就出錯了,百思不得其解,望不吝賜教:

for(i=0;i<7;i++)
 {
  if(i%2==0)
  a[i/2]==s[i]-'0';
  else
  op[(i-1)/2]=s[i];
 }

五、參考博文

參考大佬博客寫的代碼:https://blog.csdn.net/tigerisland45/article/details/99167285

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章