NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2010國中組決賽
 [Pascal]G.失落的维京战机

作者 主題: [Pascal]G.失落的维京战机  (閱讀 2392 次)

liouzhou_101

  • 初級會員
  • **
  • 文章數: 44
    • 檢視個人資料
[Pascal]G.失落的维京战机
« 於: 一月 01, 2011, 10:35:16 pm »

就是字符串的处理,我的code有点诡异。

但也是比较简短的。

注:copy()就是C的strcpy().

代碼: [選擇]
var
  T : longint;
  s : string;
function work(s:string):longint;
  var
    len,i,t : longint;
    c : integer;
  begin
    len:=length(s);
    for i:=1 to len do
      if s[i]='+' then begin
        t:=work(copy(s,1,i-1))+work(copy(s,i+1,len-i));
        work:=t;
        exit;
      end;
    for i:=1 to len do
      if s[i]='*' then begin
        t:=work(copy(s,1,i-1))*work(copy(s,i+1,len-i));
        work:=t;
        exit;
      end;
    val(s,t,c);
    work:=t;
  end;
begin
  readln(T);
  while T>0 do begin
    T:=T-1;
    readln(s);
    writeln(work(s));
  end;
end.
記錄

Nineguan

  • 初級會員
  • **
  • 文章數: 43
    • 檢視個人資料
回覆: [Pascal]G.失落的维京战机
« 回覆 #1 於: 二月 02, 2011, 12:33:37 am »

我先把中序式轉成後序式, 然後在計算

我覺得在電腦用後序式較方便, 但是有多此一舉的感覺=   =
跟樓上的做法差很多
如果有更好的方法請大大指點一下, 感激不盡^^

補充:轉後序式和後序式運算皆用堆疊
我把*, +號用ASCII 42, 43來表示
然後轉成後序式存入num陣列中


代碼: [選擇]
#include <iostream>
#include <stack>

using namespace std;

int num[100];

stack<int> st;

int main(){
    int t,n,nc,sum,x,y;
    char pt;
    scanf("%d\n",&t);
    while(t--)
    {
        nc=0;
        pt=getchar();
        while(1)
        {
            n=0;
            while(pt!='*' && pt!='+' && pt!='\n')
            {
                n=n*10+pt-48;
                pt=getchar();
            }
            num[nc++]=n;
            if(!st.empty())
            {
                if(st.top()==42)
                {
                    num[nc++]=42;
                    st.pop();
                }
            }
            if(pt=='\n')break;
            n=pt;
            st.push(n);
            pt=getchar();
        }
        while(!st.empty())
        {
            num[nc++]=st.top();
            st.pop();
        }
        for(int i=0;i<nc;i++)
        {
            if(num[i]<10)st.push(num[i]);
            else{
                y=st.top();
                st.pop();
                x=st.top();
                st.pop();
                if(num[i]==42)sum=x*y;
                else sum=x+y;
                st.push(sum);
            }
        }
        printf("%d\n",st.top());
        while(!st.empty())st.pop();
    }
    return 0;
}
« 上次編輯: 二月 02, 2011, 12:35:23 am 由 Nineguan »
記錄

sagit

  • 管理員
  • 白金會員
  • *****
  • 文章數: 217
    • 檢視個人資料
回覆: [C++] NPSC2010國中組決賽 G.失落的維京戰機
« 回覆 #2 於: 二月 06, 2011, 02:21:37 am »

因為只有 + 、 * 兩種運算子,
所以可以減化堆疊的操作:

1.將第一個數字放進堆疊
2.接下來每次取出一個運算子和一個數字,
如果是 + ,則將數字再放入堆疊,
如果是 * ,則將最後一個數字乘上這個數字即可。
3.重覆(2)的步驟,直到所有數字處理完畢為止。
4.最後將堆疊裡所有的數字加起來就是答案。

參考程式:
代碼: [選擇]
// NPSC 2010 國中組 決賽
// G.失落的維京戰機
// By sagit
// Stack
#include <cstdlib>
#include <cstdio>

using namespace std;

int main(int argc, char *argv[])
{
    int Num[101], t, p, sum, i;
    char s[101];
    scanf("%d\n", &t);
    while(t--)
    {
        gets(s);
        Num[0]=s[0]-'0';
        for (i=1, p=0; s[i]; i+=2)
            if (s[i]=='+') Num[++p]=s[i+1]-'0';
            else Num[p]*=(s[i+1]-'0');
        for (i=0, sum=0; i<=p; i++) sum+=Num[i];
        printf("%d\n", sum);
    }
    return 0;
}
記錄

Nineguan

  • 初級會員
  • **
  • 文章數: 43
    • 檢視個人資料
回覆: [C++] NPSC2010國中組決賽 G.失落的維京戰機
« 回覆 #3 於: 二月 07, 2011, 03:06:24 pm »

因為只有 + 、 * 兩種運算子,
所以可以減化堆疊的操作:

1.將第一個數字放進堆疊
2.接下來每次取出一個運算子和一個數字,
如果是 + ,則將數字再放入堆疊,
如果是 * ,則將最後一個數字乘上這個數字即可。
3.重覆(2)的步驟,直到所有數字處理完畢為止。
4.最後將堆疊裡所有的數字加起來就是答案。

啊對喔
我做了好多多餘的事情(我這題是半夜co的 腦袋就這樣不清楚了@@)
真是慚愧
感謝sagit老師的指點^^
« 上次編輯: 二月 07, 2011, 03:07:56 pm 由 Nineguan »
記錄

joe59491

  • 初級會員
  • **
  • 文章數: 30
  • qazwsxedcrfvtg14
    • 檢視個人資料
Re: [Pascal]G.失落的维京战机
« 回覆 #4 於: 一月 01, 2013, 02:31:43 pm »

參考了一下這裡的:http://www.csie.ntnu.edu.tw/~u91029/programming.html
使用g++來節省自己運算的麻煩,不過ZJ上無法使用system指令(不過NPSC好像可以用歐?!)
代碼: [選擇]
#include<stdlib.h>
#include<stdio.h>
int main(){
int T;
scanf("%d",&T);
while(T--){
char s[10000];
scanf("%s",s);
FILE *out;
out=fopen("tmp.cpp", "w");
fprintf(out,"#include <cstdio>\n");
fprintf(out,"int main(){\n");
fprintf(out," printf(\"%%d\\n\",(%s));\n",s);
fprintf(out,"   return 0;\n");
fprintf(out," }\n");
fclose(out);
system("g++ tmp.cpp -o tmp.exe");
system("tmp.exe");
}
return 0;
}
[\code]
記錄
(\ (\
(^_^) --by joe59491
+ NPSC補完計劃 » NPSC國中組 » NPSC2010國中組決賽
 [Pascal]G.失落的维京战机