2008年2月24日

给定一个仅包括加法运算的算式,请计算出结果。

算式以类似下面的形式给出:

@ @@@ @@@ @ @ @@@  @  @@@ @@@ @@@ @@@ @@@
@   @   @ @ @ @    @  @     @ @ @ @ @ @ @
@ @@@ @@@ @@@ @@@ @@@ @@@   @ @@@ @@@ @ @
@ @     @   @   @  @  @ @   @ @ @   @ @ @
@ @@@ @@@   @ @@@  @  @@@   @ @@@ @@@ @@@

数字和+号的位置大小比例以及笔画长短粗细间距都是可变的。例如上面的算式也可以是这样:

         @@@@
@@  @@@  @@@@     @@@          @@@ @@@ @@@          @@@@@
@@  @@@    @@     @       @@@    @ @ @ @ @          @@@@@
@@    @  @@@@ @ @ @    @  @      @ @ @ @ @          @@ @@
@@  @@@  @@@@ @@@ @@@ @@@ @@@    @ @@@ @@@          @@@@@
@@  @      @@   @   @  @  @ @    @ @ @   @          @@@@@
@@  @@@  @@@@   @ @@@  @  @@@    @ @@@ @@@
         @@@@          @
                       @

但是保证不会发生笔画的缺损断裂歪斜扭曲等情况,所有字符在外形上都是可以辨识的,不会与其他字符发生混淆。相邻两个字符之间至少使用一列空格符分隔。

输入文件expression.in中包含了一个算式,文件总行数不超过100,每行不超过100个字符。运算的最终结果不超过10000000。算式只由@组成。

在expression.out中输出单独一行一个整数表示最终的运算结果。

输入样例:
                             @
                             @     @
  @@@@@@@@@@@@@@@            @
  @@@@@@@@@@@@@@@            @
  @@@@@@@@@@@@@@@            @              @@@@@@@@@@@@@@@@ @@@
  @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@                            @
  @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@                            @
  @@@@@@@@@@@@@@@            @          @                    @
   @@@@@@@@@@@@@@                    @ @@@                   @
                                        @                    @
                                                             @@@
                                                               @
                                                             @@@

输出样例:33

上面是挤压的:7+11+15

这题思想不难,写起来有点烦~~过程如下
1.先通过一次扫描将每个数字的下标和所占的宽度记录到sign[]数组中
2.然后依次横向压缩放入compressStr1
3.再将comperessStr1纵向压缩放入comperssStr2
这里的压缩就是如果上一行(列)与下一行相同则取出上一行(列)

-------b.txt--
                             @
                             @     @
  @@@@@@@@@@@@@@@            @
  @@@@@@@@@@@@@@@            @
  @@@@@@@@@@@@@@@            @              @@@@@@@@@@@@@@@@ @@@
  @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@                            @
  @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@                            @
  @@@@@@@@@@@@@@@            @          @                    @
   @@@@@@@@@@@@@@                    @ @@@                   @
                                        @                    @
                                                             @@@
                                                               @
                                                             @@@

--------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication2
{
    //记录分割的起始地址下标和宽度
    class Sign
    {
       public int idx = 0;
       public int len = 0;
       public Sign(int i, int l)
       {
           idx = i; len = l;
       }
    }

    class Program
    {
        int adjust()
        {
            //结束施放
            using (
            StreamReader sr = new StreamReader(new FileStream(Environment.CurrentDirectory + "//b.txt"
    , FileMode.Open, FileAccess.Read)))
            {
               
                //存储算式
                string[] str1 = new string[100];
                //行数
                int maxRows = 0;               
                int maxCols=0;

                //载入
                while (!sr.EndOfStream)
                {
                    str1[maxRows++] = sr.ReadLine();
                }
                //打印
                print(str1,maxRows);
                int tmp=0;
                //获取maxCols的值
                for (int row = 0; row < maxRows; row++)
                {
                    tmp = str1[row].Length;
                    if (maxCols < tmp)
                        maxCols = tmp;
                }

                //该列的空格数
                int[] spaceCount=new int[maxCols];

                //找到全空列
                for (int row = 0; row < maxRows; row++)
                {
                    for (int col = 0; col <str1[row].Length ; col++)
                    {
                        //出现@则修改spacCount
                        if (str1[row][col].ToString() == "@")
                            spaceCount[col]=1;  
                    }
                }
                //分割的下标位置
                int[] partitionIndex = new int[maxCols/2];  

                //精确标识下标及其长度
                List<Sign> signIndex = new List<Sign>();
                //获取不空列的下标
                int pIdx = 0;
                //取出所有字符所有在列的下标及其长度 singIndex
                for(int col=0;col<maxCols;col++)
                {
                    //当前列是有数字的的
                    if (spaceCount[col] == 1)
                    {
                        //连续len++
                        if (pIdx > 0 && (signIndex[signIndex.Count-1].idx == col -
                            signIndex[signIndex.Count-1].len))
                        {
                            signIndex[signIndex.Count - 1].len++;
                        }
                        else
                        {
                            signIndex.Add(new Sign(col, 1));
                        }
                        pIdx++;
                    }
                }
                //总字符数
                int maxLetter = signIndex.Count;

                //StringBuilder curSb = new StringBuilder();
                //被压缩的字符
                List<string>[] compressStr = new List<string>[maxLetter];
                for (int idx = 0; idx < maxLetter;idx++ )
                {
                    compressStr[idx] = new List<string>();

                }
                //逐个纵向字母压缩
                for (int letter = 0; letter < maxLetter; letter++)//行扫描
                {                   
                    //行数
                    for (int row = 0; row < maxRows; row++)
                    {
                      
                            StringBuilder curRowSb = new StringBuilder();
                            //获取当前 当前row 中的字符串
                            for (int col = signIndex[letter].idx; col < signIndex[letter].idx+signIndex[letter].len;
                                col++)
                            {
                                if (col >= str1[row].Length)
                                {
                                    curRowSb.Append(" ");
                                }
                                else
                                    curRowSb.Append(str1[row][col]);
                            }
                            string emptys = EmptyString(signIndex[letter].len);
                            //空 或者与上一行相等
                            //压缩
                            if (curRowSb.ToString() == emptys || (compressStr[letter].Count > 0
                                && compressStr[letter][compressStr[letter].Count - 1] == curRowSb.ToString()))
                            {
                                continue;//next row
                            }
                            else
                            {
                                compressStr[letter].Add(curRowSb.ToString());
                            }
                            //清空
                            curRowSb = null;

                    }
                }
                //第二次压缩
                List<string>[] compressStr2 = new List<string>[maxLetter];
                for (int idx = 0; idx < maxLetter; idx++)
                {
                    compressStr2[idx] = new List<string>();

                }
                //横向压缩
                for (int letter = 0; letter < maxLetter; letter++)
                {                   
                    for (int col = 0; col < signIndex[letter].len; col++)
                    {
                       
                        StringBuilder comp1ColSb = new StringBuilder();

                        for (int row=0;row<compressStr[letter].Count; row++)
                        {                           
                            if(col<compressStr[letter][row].Length)
                            comp1ColSb.Append(compressStr[letter][row][col]); 
                            else
                                comp1ColSb.Append(" "); 
                        }
                       
                       //已经加到
                        StringBuilder comp2ColSb = new StringBuilder();
                    
                        //压缩
                        if (compressStr2[letter].Count > 0 )
                        {
                            //获取letter的col列
                            for (int row = 0; row < compressStr2[letter].Count; row++)
                            {
                                comp2ColSb.Append(compressStr2[letter][row][compressStr2[letter][row].Length-1]);
                            }
       
                            //相等列
                            if (comp1ColSb.ToString() == comp2ColSb.ToString())
                                continue;
                            else//插入列
                            {
                                //count 为行数
                                for (int row = 0; row < compressStr2[letter].Count; row++)
                                {
                                    //c2ColSb为当前列
                                    compressStr2[letter][row] += comp1ColSb[row].ToString();
                                }
                               
                            }                               
                        }
                        else
                        {
                            //建立rows
                            for (int row = 0; row < comp1ColSb.Length; row++)
                            {
                                //c2ColSb为当前列
                                compressStr2[letter].Add(comp1ColSb[row].ToString());
                            }

                        }
                    }
                }

                //运算               
              return compute(compressStr2);
            }          

        }
        //计算算式
        int compute(List<string>[] cps)
        {
       
            StringBuilder cti = new StringBuilder();
            for (int i = 0; i < cps.Length; i++)
            {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < cps[i].Count; j++)
                {
                    sb.Append(cps[i][j]);
                }
                cti.Append(changetoint(sb.ToString()));
            }
           
            //下标           
            int index=0;
            //结果
            int tSum=0,resultSum=0;
            //存取数
            int tp=0;
            while(index<cti.Length)
            {               
                tSum = 0;
                while(index<cti.Length&& int.TryParse(cti[index++].ToString(),out tp))
                {
                    tSum = tSum * 10 + tp;
                   
                }
                resultSum+=tSum;
            }
           
            return resultSum;
        }
        //将图像变成数字
        char changetoint(string s)
        {
            switch (s)
            {
                case "@": return '1';
                case "@@@  @@@@@  @@@": return '2';
                case "@@ @@@ @@@": return '3';
                case "@ @@@@  @": return '4';
                case "@@@@  @@@  @@@@": return '5';
                case "@@@@  @@@@ @@@@":return '6';
                case "@@ @": return '7';
                case "@@@@ @@@@@ @@@@": return '8';
                case "@@@@ @@@@  @@@@": return '9';
                case "@@@@ @@@@": return '0';
                default: return '+';
            }           
        }

        string EmptyString(int n)
        {
            StringBuilder sb = new StringBuilder();
            while (n-- > 0)
            {
                sb.Append(" ");
            }
            return sb.ToString();
        }

        void print(string[] str, int idx)
        {
            for(int i=0;i<idx;i++)
            {
                Console.WriteLine(str[i]);
            }
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            Console.Write(p.adjust().ToString());
            Console.ReadLine();

        }
    }
}


posted @ 2008-02-24 21:18 Humtong 阅读(698) 评论(0) 编辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    /*
     求三个数的最小公倍数的方法
     *
     * 通常会使用下面的hcf函数做 但效率低
     *
     * greatestCommonDivisor是另一种方法
     * 例如
     * 210 % 27  = 21
     * 27 % 21 =6
     * 21 % 6 = 3
     * 6%3=0;
     * 当余数为0的前一步就是他们的最小公倍数
     */
    class Program
    {
      //通常方法
      static int HCF(int pNum1, int pNum2, int pNum3)
      {

          int minNum = pNum1 < pNum2 ? pNum1 : pNum2;
          minNum = minNum < pNum3 ? minNum : pNum3;

          if (pNum1 % minNum == 0 && pNum2 % minNum == 0 && pNum3 % minNum == 0)
          {
              return minNum;
          }
          //除以最小一个
          for (int i = minNum / 2; i > 0; i--)
          {
              if (pNum1 % i == 0 && pNum2 % i == 0 && pNum3 % i == 0)
                  return i;
          }
          return -1;
      }

      int greatestCommonDivisor(int a, int b)
      {
          int result = 0;
          //swap
          if (a > b) { a ^= b; b ^= a; a ^= b; }
          //a 较小数 b较大数
          //除不尽一直递归
          while (b % a != 0)
          {
              result = greatestCommonDivisor(b % a, a);
              break;
          }
          if (b % a == 0 && a != 0)
              result = a;
          return result;
      }


        static void Main(string[] args)
        {
            Program p = new Program();
            int x, y, z, w, v;
            Console.Write("请输入你要求公因子的三个整数:\r\n");
            x = 12;
            y = 64;
            z = 32;
            w = p.greatestCommonDivisor(x, y);
            v = p.greatestCommonDivisor(w, z);
            Console.WriteLine(v);
            //Console.ReadLine();
        }
    }
}

posted @ 2008-02-24 14:26 Humtong 阅读(589) 评论(0) 编辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 抛硬币两种序列
{
    /*   考虑一个事件,它有两种概率均等的结果。比如掷硬币,出现正面和反面的机会是相等的。现在我们希望知道,如果我不断抛掷硬币,需要多长时间才能得到一个特定的序列。

序列一:反面、正面、反面
序列二:反面、正面、正面

    首先,我反复抛掷硬币,直到最近的三次抛掷结果形成序列一,然后我记下这次我抛掷了多少次才得到了我要的序列。重复执行这个过程,我可以算出得到序列一平均需要的抛掷次数。同样地,反复抛掷硬币直到序列二产生,它所需要的次数也有一个平均值。你认为这两个平均值哪一个大哪一个小?换句话说,出现序列一平均所需的抛掷次数少还是出现序列二平均需要的次数少?


    大多数人会认为,两个序列会以同样快的速度出现,因为在所有“正”和“反”的8种三元组合里,“反正反”和“反正正”各占1/8,其概率是均等的。而事实上,我们将会看到掷出序列二所需的次数更少一些。不妨考虑这样一个问题:在由“正”和“反”构成的n位01序列中,有多少个序列以序列一结尾但之前不曾出现过序列一?有多少个序列以序列二结尾但之前不曾出现过序列二?当n比较小时,两者答案是一样的(例如n=3时符合要求的情况都是唯一的),但到后来n越大时,两者的差距越明显:后者的个数总比前者的个数要多一些。不妨看一看n=6的情况。对于序列一,只有以下5个序列是符合要求的:

反反反反正反

反正正反正反

正正正反正反

正反反反正反

正正反反正反

    但对于序列二来说,符合条件的序列就有7个:

反反反反正正

反正反反正正

反反正反正正

正反反反正正

正正反反正正

正正正反正正

正反正反正正

    你可以通过计算机编程枚举,计算一下n为其它值的情况。计算结果和刚才也一样:在n位01序列中,以序列二结尾但之前不含序列二的情况不会少于以序列一结尾但之前不含序列一的情况。这说明,抛掷第n次硬币后恰好出现了序列二,其概率不会小于恰好出现序列一的概率。显然,当n渐渐增大时,这个概率应该呈下降趋势;同时,随着n的增长,两个序列各自出现的概率由相等开始慢慢拉开差距,第n次抛掷产生序列二的概率下降得要缓慢一些,或者说更多的情况集中发生在n更小的时候。因此总的来说,出现序列二所需要的抛掷硬币次数的期望值更小。
    虽然我们通过一系列的观察验证了这个结论,并且我们也相信这个结论是正确的(虽然没有严格的证明),但我们仍然不是很接受这个结论。这种情况是有悖于我们的直觉的,它与我们的生活经验不相符合。此刻,我们迫切需要一个解释,来说明这种出人意料的反常现象产生的原因。*/
    class Secort
    {


        int factorial(int pN)
        {
            if (pN == 0)
                return 1;
            if (pN == 1)
                return 1;
            return pN * factorial(pN - 1);
        }

        int Sec(int pN,int[] pSec)
        {
            //可能的情况
            int count=factorial(pN - pSec.Length)+2;
            //备用
            int ftNum=count;
            //生成序列 每一行一种 后面序列个数
            int[,] secX = new int[count, pN];
            //几行
            int rank1Length = secX.Length / pN;

           
            for (int rank1Idx = 0; rank1Idx < rank1Length; rank1Idx++)
            {               
                //最后三位//初始化
                for(int lastIdx=1;lastIdx<=pSec.Length;lastIdx++)
                {
                    secX[rank1Idx, pN - lastIdx] = pSec[pSec.Length - lastIdx];
                }
                //前n-l位

                //当前行 某种情况 二进制
                string binString = Int2Bin(rank1Idx);
                //计算需要自动自动补0的个数
                int notAutoZero=(pN-pSec.Length)-binString.Length;
                //复制下标
                int bsIdx = 0;
                for (int firstIdx = 0; firstIdx <pN-pSec.Length; firstIdx++)
                {
                    if(notAutoZero==0)
                    {
                        secX[rank1Idx, firstIdx] = int.Parse(binString[bsIdx++].ToString());
                    }
                    else
                    {
                        secX[rank1Idx,firstIdx]=0;
                        notAutoZero--;
                    }
                }               
                int k = 0;
                for(int rank2Idx=0;rank2Idx<pN-pSec.Length;rank2Idx++)
                {
                    for (int inner = 0; inner < pSec.Length; inner++)
                    {
                        if (secX[rank1Idx, rank2Idx + inner] == pSec[inner])
                        {
                            k++;
                            //出现序列一                           
                        }
                        else
                            k = 0;
                    }
                    //相等
                    if (k == 3)
                    {
                        count--;
                        //输出test
                        //for (int v = 0; v < pN; v++)
                        //{
                        //    Console.Write(secX[rank1Idx, v].ToString() + " ");
                        //}
                        //Console.Write("\n");
                        break;
                    }                   
                }               
            }
           
            return count;
        }

        public static string Int2Bin(int n)
        {
            uint un = (uint)n;
            string s = null, t = null;
            for (; un > 0; un /= 2) s += un % 2;
            if (s == null) s = "0";
            for (int i = s.Length - 1; i >= 0; i--) t += s[i];
            return t;
        }  

        static void Main(string[] args)
        {
            int[] sec1 = new int[3] { 0, 1, 0 };
            int[] sec2 = new int[3] { 0, 1, 1 };
            Secort st = new Secort();
            while (true)
            {
                Console.Clear();
                Console.WriteLine("输入数字n,表示有n位二进制 n>3 (当n==1)查看n=5到10长度时两种情况几率");
                int n = int.Parse(Console.ReadLine());
               
                if (char.Parse(n.ToString())== '0')
                    break;
                //查看几率 详细解释参看www.matrix67.com
                if (char.Parse(n.ToString()) == '1')
                {
                    for (int i = 5; i < 11; i++)
                    {
                        Console.Write("[n={0}]\n {1} 反正反几率\n {2} 反正正几率\n ",
                       i,(Convert.ToDouble(st.Sec(i, sec1))
                           / Convert.ToDouble((st.Sec(i, sec1) + st.Sec(i, sec2))))
                           .ToString()
                           ,(Convert.ToDouble(st.Sec(i, sec2))
                           / Convert.ToDouble((st.Sec(i, sec1) + st.Sec(i, sec2))))
                           .ToString());
                    }
                    //显然反正正几率更大
                    Console.ReadLine();
                    break;
                }
                else
                {

                    Console.Write("符合条件 反正反:{0}\n", st.Sec(n, sec1));
                    Console.Write("符合条件 反正正:{0}\n", st.Sec(n, sec2));
                }
                Console.ReadLine();
            }
            //int a=100;
            //Console.Write("{0}",Int2Bin(11).ToString().Length.ToString());
        }
    }
}

posted @ 2008-02-24 14:06 Humtong 阅读(128) 评论(0) 编辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*第三题:game 矩阵取数游戏
    一个n行m列的矩阵,每次你需要按要求取出n个数,m次正好将所有数取完。每取出一个数你都会有一个得分,请求出最终的得分最大是多少。
    每一次取数的要求:每一行中恰好取一个数,且只能取剩下的数中最左边或最右边位置上的数
    每取一个数的得分:所取数的数值乘以2^i,i表示这是第i轮取数。
    矩阵中的数为不超过100的自然数,1<=n,m<=80

样例输入:
2 3
1 2 3
3 4 2
样例输出:
82
样例说明:
1*2+2*2 + 2*4+3*4 + 3*8+4*8 = 82*/

/*题目比较简单 */
namespace ConsoleApplication1
{
    class Program
    {
        //n,m
        long Game(int pN, int pM)
        {
            int[,] chess = new int[pN, pM];
            int[,] rChess = new int[pN, pM];
            long result = 0;
            int min = 0;
            for (int i = 0; i < chess.Length; i++)
            {
                chess[i/pM,i%pM] = int.Parse(Console.ReadLine());
            }
            //get times m
            for (int i = 0; i < pM; i++)
            {
                //get nums n
                for (int j = 0; j < pN; j++)
                {
                    //
                    min = 0;

                    for(int k=1;k<pM;k++)
                    {
                        if (chess[j,k] < chess[j,min])
                            min = k;
                    }
                    result+=chess[j,min] * Squre(2, i + 1);
                    chess[j,min] = Int32.MaxValue;
                }
            }
            return result;
        }

        int Squre(int pNum, int pT)
        {
            int r = 1;
            while (pT-- > 0)
            {
                r *= pNum;
            }
            return r;
        }

        static void Main(string[] args)
        {
            Program p=new Program();
            Console.Write(p.Game(2,3));
        }
    }
}

posted @ 2008-02-24 13:43 Humtong 阅读(854) 评论(1) 编辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*【问题描述】
恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时,刀上的所有人都会遇难:守望者的跑步速度,为17m/s, 以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。

【输入】

输入文件escape.in仅一行,包括空格隔开的三个非负整数M,S,T。

【输出】

输出文件escape.out包含两行:
第1行为字符串"Yes"或"No" (区分大小写),即守望者是否能逃离荒岛。
第2行包含一个整数,第一行为"Yes" (区分大小写)时表示守望着逃离荒岛的最短时间,第一行为"No" (区分大小写) 时表示守望者能走的最远距离。

【输入输出样例1】
escape.in
39 200 4

escape.out
No
197

【输入输出样例2】
escape.in
36 255 10

escape.out
Yes
6

*/
/*
以下是解决方法
之前在网上找了别人的解法基本都是错误(只是比较烦)的以在什么条件下用魔法去闪烁
作为判断依据导致判断条件变得非常复杂
其实找到所有用跑的情况就可以了 别的都用魔法

最开始当然是有多少魔法用多少魔法了
*/
namespace ConsoleApplication1
{
    class Program
    {
        //m magic , s space t time,
        static void Escape(int M,int S,int T)
        {
            //10 maigc = s 60
            //run 17/s
            //sit resume migc 4/s
            //copy t s
            int T1=T;
            int S1 = S;
            int mt=0;     
           //没跑完
            while (S > 0)
            {
                //use magic first
                if (M >=10)
                {
                    T--;//time
                    M -= 10;//maic
                    S -= 60;//space
                }
                else//judge
                {
                    //魔法所用时间
                    mt=(13-M)/4+1;
                    //直接跑
                    if (S < 17 || S < 17 * mt)
                    { 
                        //减去时间
                        T-= (S+16)/17;
                        //减去距离
                        S-=17*((S+16)/17);
                    }
                    else //use magic
                    {
                        T -= mt;
                        S -= 60;
                    }
                }
            }
            if(T<0)
            {

                Console.WriteLine("No "+(S1-17-S));           
            }
            else
                Console.WriteLine("Yes "+(T1-T).ToString());

        }

        static void Main(string[] args)
        {
            Escape(39, 200, 4);
            Escape(36, 255, 10);
            Escape(6, 35, 2);
        }
    }
}

posted @ 2008-02-24 13:40 Humtong 阅读(278) 评论(1) 编辑

输入 1234567890+-*/=() 得到
 
其实就是微机原理中的数码管
好辛苦……~~
class PrintNumbers
    {
        int ConvertToOX(char n)
        {
            switch (n)
            {
                case '1': return 0x4924;//100 1001 0010 0100
                case '2': return 0x73e7;//111 0011 1110 0111
                case '3': return 0x79e7;//111 1001 1110 0111
                case '4': return 0x49ed;//100  1001 1110 1101
                case '5': return 0x7bcf;//111 1011 1100 1111
                case '6': return 0x7bef;//111 1011 1100 1111
                case '7': return 0x4927;//100 1001 0010 0111
                case '8': return 0x7bef;//111 1011 1110 1111
                case '9': return 0x79ef;//111 1001 1110 1111
                case '0': return 0x7b6f; //111 1011 0110 1111
                case '+': return 0x25d2; //010 0101 1101 0010
                case '-': return 0x1c0; //000 0001 1100 0000
                case '*': return 0xaa8; //000 1010 1010 1000
                case '/': return 0x21c2; //010 0001 1100 0010
                case '=': return 0xe38; //000 1110 0011 1000
                case '(':return 0x4494;//100 0100 1001 0100
                case ')':return 0x1491;//001 0100 1001 0001
                default: return 0;
            }
        }

        void PrintNumber(string n)
        {
           
            int[] numbers = new int[n.Length];
            //init
            for(int i=0;i<n.Length;i++)
            {
                numbers[i]=ConvertToOX(n.ToCharArray()[i]);
            }
            int tooken = 0, ltooken = 0, rtooken = 0;           
            int kitooken = 0;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 5; i++)
            {
                //数字个数
                for (int j = 0; j <n.Length; j++)
                {
                    tooken = numbers[j] & 7;
                   
                    numbers[j] >>= 3;

                    //下面这段可以 将二进制首位互换
                    //ltooken=tooken >> 2;
                    //rtooken = tooken & 1;
                    //rtooken = (rtooken << 2) | 3;//x11
                    //ltooken = (ltooken >> 2) | 5;//11x
                    //tooken &= rtooken;
                    //tooken &= ltooken;

                    for (int k = 0; k < 3; k++)
                    {
                        kitooken=tooken&1;
                        tooken >>= 1;                       
                        sb.Append(kitooken==1?"@":" ");
                    }
                    sb.Append(" ");
                }
                sb.Append("\n");
            }
            Console.WriteLine(sb.ToString());
        }

        static void Main(string[] args)
        {
            PrintNumbers p = new PrintNumbers();
            p.PrintNumber("1234567890+-*/=()");
            p.PrintNumber("1+(2-3)*4+5=6");
        }
    }

posted @ 2008-02-24 13:32 Humtong 阅读(44) 评论(0) 编辑

Problem
    小卡卡继续着他的Pascal圣地之行。他来到了Pascal农场主John的家里,向他探询关于Pascal圣地宝藏的事。
    John答应小卡卡愿意把他所知道的一切告诉小卡卡,但是John有一个要求,那就是希望小卡卡帮助他找出他走丢的一头奶牛。
    John的奶牛都是由1-2^k编号的,但是John在放牛的时候无意中弄丢了一头奶牛。他希望小卡卡告诉他,他走丢的奶牛的编号是多少。

Input
    该题含有多组测试数据。
    每组测试数据第一行一个整数k表示奶牛的数目为2^k(1<=k<=20)。
    第二行到第2^k行每行一个整数表示还在农场的一头奶牛的编号(并不是按顺序给出的)。

Output
    输出走丢的奶牛的编号

Sample Input
2
4
1
3

Sample Output
2

#0
(1+2^k)*(2^(k-1))-(/*减去数到的牛*/i..)

#1 //将所有数到的牛做异或 最后和2^k做异或
     int cow(int k)
        {
            int sum = 1 << k;
            //losted cow should be 'sum-1'
            int r=0;
            for (int i = 1; i < sum ; i++)
            {
                 r^=i;
            }
            return r^sum;           
        }

posted @ 2008-02-24 02:05 Humtong 阅读(171) 评论(0) 编辑


posts - 14, comments - 11, trackbacks - 0, articles - 0

Copyright © Humtong