ZOJ 1098 - Simple Computers

Implement #1:
 1  /*  Accepted 1098 C++ 00:00.01 844K  */
 2  #include  < stack >
 3  #include  < string >
 4  #include  < iostream >
 5 
 6  using   namespace  std;
 7 
 8  int  main()
 9  {
10       string  mem[ 32 ];
11      
12       while (cin  >>  mem[ 0 ])
13      {
14           int  accu, pc;
15          
16           for ( int  i  =   1 ; i  <   32 ; i ++ )
17              cin  >>  mem[i];
18          
19          accu  =   0 ; pc  =   0 ;
20           while ( true )
21          {
22               int  x  =   0 , m[]  =  { 16 8 4 2 1 };
23              
24               string  ins  =  mem[pc].substr( 0 3 );
25               string  num  =  mem[pc].substr( 3 8 );
26               for ( int  i  =   0 ; i  <  num.size(); i ++ )
27                  x  +=  (num[i]  -   ' 0 ' *  m[i];
28              
29              pc  =  ( ++ pc)  %   32 ;
30              
31               if (ins  ==   " 000 " )
32              {
33                  stack  < char >  st;
34                   int  n  =  accu;
35                   while (n)
36                  {
37                      st.push(n  %   2   +   ' 0 ' );
38                      n  /=   2 ;
39                  }
40                   while (st.size()  <   8 )
41                      st.push( ' 0 ' );
42                   for ( int  i  =   0 ; i  <   8 ; i ++ )
43                  {
44                      mem[x][i]  =  st.top();
45                      st.pop();
46                  }
47              }
48               if (ins  ==   " 001 " )
49              {
50                  accu  =   0 ;
51                   int  m[]  =  { 128 64 32 16 8 4 2 1 };
52                   for ( int  i  =   0 ; i  <   8 ; i ++ )
53                      accu  +=  (mem[x][i]  -   ' 0 ' *  m[i];
54              }
55               if (ins  ==   " 010 " )
56                   if (accu  ==   0 )
57                      pc  =  x;
58               if (ins  ==   " 100 " )
59              {
60                  accu -- ;
61                   if (accu  <   0 )
62                      accu  =   255 ;
63              }
64               if (ins  ==   " 101 " )
65                  accu  =  ( ++ accu)  %   256 ;
66               if (ins  ==   " 110 " )
67                  pc  =  x;
68               if (ins  ==   " 111 " )
69                   break ;
70          }
71          
72          stack  < int >  st;
73           while (accu)
74          {
75              st.push(accu  %   2 );
76              accu  /=   2 ;
77          }
78           while (st.size()  <   8 )
79              st.push( 0 );
80           for ( int  i  =   0 ; i  <   8 ; i ++ )
81          {
82              cout  <<  st.top();
83              st.pop();
84          }
85          cout  <<  endl;
86      }
87      
88       return   0 ;
89  }
90 

Implement #2:
 1  /*  Accepted 1098 C++ 00:00.01 836K  */
 2  #include  < string >
 3  #include  < iostream >
 4 
 5  using   namespace  std;
 6 
 7  int  main()
 8  {
 9       string  s;
10       while (cin  >>  s)
11      {
12           int  mem[ 32 =  { 0 }, m[]  =  { 128 64 32 16 8 4 2 1 };
13          
14           for ( int  i  =   0 ; i  <   8 ; i ++ )
15              mem[ 0 +=  (s[i]  -   ' 0 ' *  m[i];
16           for ( int  i  =   1 ; i  <   32 ; i ++ )
17          {
18              cin  >>  s;
19               for ( int  j  =   0 ; j  <   8 ; j ++ )
20                  mem[i]  +=  (s[j]  -   ' 0 ' *  m[j];
21          }
22          
23           int  accu  =   0 , pc  =   0 ;
24           bool  over  =   false ;
25           while (over  ==   false )
26          {
27              pc  %=   32 ;
28              
29               int  x  =  mem[pc]  &   31 ;    //  (31)10  = (00011111)2
30               switch (mem[pc]  &   224 )    //  (224)10 = (11100000)2
31              {
32                   case    0   : mem[x]  =  accu; pc ++ ;    break ;
33                   case   32   : accu  =  mem[x]; pc ++ ;    break ;
34                   case   64   :  if (accu  ==   0 )
35                                 pc  =  x;
36                               else
37                                  pc ++ ;              break ;
38                   case   96   : pc ++ ;                   break ;
39                   case   128  : accu -- ;
40                              if (accu  <   0 )
41                                 accu  =   255 ;
42                             pc ++ ;                   break ;
43                   case   160  : accu  =  ( ++ accu)  %   256 ;
44                             pc ++ ;                   break ;
45                   case   192  : pc  =  x;                 break ;
46                   case   224  : over  =   true ;            break ;
47              }
48          }
49           for ( int  i  =   7 ; i  >=   0 ; i -- )
50              cout  <<  ((accu  >>  i)  &   1 );
51          cout  <<  endl;
52      }
53      
54       return   0 ;
55  }
56 

你可能感兴趣的:(ZOJ 1098 - Simple Computers)