今天本人正在看算法方面的书。作为高中数学忘得差不多的渣渣,实在无力。无奈找了本书,c语言写的,哎。我就把其中代码翻译成C#版好了。此坑能否填平,看我耐性和网络支持条件吧。有生之年能看完的话我会把整个项目上传的。

 那就开坑吧。为了直观性舍弃代码规范性,所以如果有人不幸看到,不要吐槽,谢谢。

从第一章开始。

   public class _1_1看商品猜价格

    {
        public void 看商品猜价格()
        {
            Console.WriteLine("设置商品真实价格");
            int 真正价格 = int.Parse(Console.ReadLine());
            Console.WriteLine("设置猜测价格");
            int 猜测价格 = int.Parse(Console.ReadLine());
            int 猜测次数 = 1;
            while (猜测价格 != 真正价格)
            {
                猜测次数++;
                Console.WriteLine("继续猜");
                猜测价格 = int.Parse(Console.ReadLine());
            }
            Console.WriteLine("你猜了" + 猜测次数+"次才猜中");

            //Console.WriteLine("  ");
        }
    }

 

   public class _1_2斐波那契数列

    {
        public long i = 0;
        public void 计算斐波那契数列()
        {
            //1.3.2 顺推实例:斐波那契数列
            Console.WriteLine("设置N");
            long N = long.Parse(Console.ReadLine());

            tailrecursion(11, N);

            //long sum = 0;
            
//for (long i = 0; i <= N; i++)
            
//{
            
//    Console.WriteLine(i + " " + sum);
            
//    sum += 斐波那契数列(i);            
            
//
        }

        public void tailrecursion(long a, long b, long n)
        {
            if (n==0)
            {
                return;
            }           
            i++;
            Console.WriteLine(i + " " + (a + b)); 
            tailrecursion(b,a+b, n - 1);
            n--;
        }

        public long 斐波那契数列(long n)
        {
            if (n <= 2)
            {
                return 1;
            }
            else
            {
                return 斐波那契数列(n - 1) + 斐波那契数列(n - 2);
            }     
        }


    }

实现了2种 

网上那种 计算斐波那契数列的C#实现(注释的代码)完全是垃圾!垃圾的地方在于递归方法调用2次,在N越来越大的时候非常明显,而用尾递归(tailrecursion
的话飞速算完。不幸的原文用的就是我注释的那部分方法。

 

  class _1_3用逆推法求最初存钱数

    {
       public void 求最初存钱数()
        {
            int 本息 = 1000;
            Double 年利率 = 0.0171;

            double[] 本利合计 =new double[49];
            int i;
            本利合计[48] = 本息;
            for ( i = 47;i > 0; i--)
            {
                本利合计[i] = (本利合计[i + 1] + 本息) / (1 + 年利率/12);                  
            }
            for ( i = 48; i > 0; i--)
            {
                Console.WriteLine(""+i+"月末本利合计:"+本利合计[i]);    
            }
            
        }       

    }

 

   class _1_4用枚举法完成填数游戏

    {
        public void 用枚举法完成填数游戏()
        {

            int i1, i2, i3, i4, i5;
            long multi, result;
            for (i1 = 1; i1 <= 9; i1++)
            {
                for (i2 = 0; i2 <= 9; i2++)
                {
                    for (i3 = 0; i3 <= 9; i3++)
                    {
                        for (i4 = 0; i4 <= 9; i4++)
                        {
                            for (i5 = 1; i5 <= 9; i5++)
                            {
                                multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
                                result = i5 * 111111;
                                if (multi * i1 == result)
                                {
                                    Console.WriteLine(i1 + "" + i2 + "" + i3 + "" + i4 + "" + i5);
                                    Console.WriteLine("X" + i1);
                                    Console.WriteLine("____________");
                                    Console.WriteLine(i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5);
                                }
                            }
                        }
                    }
                }
            }
        }
    }


1-6使用递归算法计算阶乘 

            int i;
            Console.WriteLine("请输入要求阶乘的一个整数:");
            i = int.Parse(Console.ReadLine());
            Console.WriteLine(i+"的阶乘结果为:"+fact(i));
        }
        int fact(int n)
        {
            if (n <= 1)
                return 1;
            else
                return n * fact(n - 1);
        }

 

 1_8兵乓球比赛日程安排

        int[,] a = new int[6565];
        public void Run()
        {
            int m, i, j;
            Console.WriteLine("输入参赛选手人数:");
            m = int.Parse(Console.ReadLine());
            j = 2;
            for (i = 2; i < 8; i++)
            {
                j = j * 2;
                if (j == m)
                    break;
            }
            if (i >= 8)
            {
                Console.Write("参赛选手人数必须为2的整数次幂,且不超过64!\n");
            }
            gamecal(1, m);
            Console.Write("\n编号");
            for (i = 2; i <= m; i++)
            {
                Console.Write( i - 1+"天 ");
            }
            Console.WriteLine("\n");
            for (i = 1; i <= m; i++)
            {
                for (j = 1; j <= m; j++)
                    Console.Write(" " + a[i, j] + " ");
                Console.Write("\n");
            }
        }
        private void gamecal(int k, int n)
        {

            int i, j;
            if (n == 2)
            {
                a[k, 1] = k;  //参赛选手编号
                a[k, 2] = k + 1//对阵选手编号
                a[k + 11] = k + 1//参赛选手编号 
                a[k + 12] = k; //对阵选手编号 
            }
            else
            {
                gamecal(k, n / 2);
                gamecal(k + n / 2, n / 2);
                for (i = k; i < k + n / 2; i++) //填充右上角 
                {
                    for (j = n / 2 + 1; j <= n; j++)
                    {
                        a[i, j] = a[i + n / 2, j - n / 2];
                    }
                }
                for (i = k + n / 2; i < k + n; i++) //填充左下角 
                {
                    for (j = n / 2 + 1; j <= n; j++)
                    {
                        a[i, j] = a[i - n / 2, j - n / 2];
                    }
                }
            }
        }

 

 1-9用贪婪算法求找零钱

View Code 

 

 1-11用试探法生成彩票组合

View Code 

 

1-12模拟法猜数游戏 

View Code 

 

1-13模拟法掷骰子游戏 

View Code

 

 

DDD

posted on 2014-01-13 22:36  Cherbim  阅读(8388)  评论(0编辑  收藏  举报

这是页脚