• 5个编程问题(1小时解决)


    题目来自于博客园:http://news.cnblogs.com/n/520705/?utm_source=tuicool    一个小时解决有点难度。

    程序位于:D:C#编程代码demo基础104 FiveQuestion

    问题1

      使用 for 循环、while 循环和递归写出 3 个函数来计算给定数列的总和。

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("数组1-9的和,使用 for 循环、while 循环和递归三种方法的结果为:");
                Console.WriteLine(Sum1(Numbers));
                Console.WriteLine(Sum2(Numbers));
                Console.WriteLine(Sum3(Numbers,0));
                Console.WriteLine("1加到100的和为:"+Sum4(100));
                Console.ReadLine();
            }
    
    
            static int[] Numbers = {1,2,3,4,5,6,7,8,9};
            static int Sum1(int[] numbers)
            {
                int sum = 0;
                for(int i = 0;i < numbers.Length; i++)
                {
                    sum += numbers[i];
                }
                return sum;
            }
            static int Sum2(int[] numbers)
            {
                int sum = 0;
                int i = 0;
                while(i < numbers.Length)
                {
                    sum += numbers[i];
                    i++;
                }
                return sum;
            }
            static int Sum3(int[] numbers,int index)   //递归, f([],x)=[0]+f([],x-1)
            {
                if(index == numbers.Length - 1)
                {
                    return numbers[index];
                }
                else
                {
                    return numbers[index] + Sum3(numbers,index + 1);
                }
            }
            //反向求和的一个方法,从i开始一直递归到1为止
            static int Sum4(int i)
            {
                if(i == 1)
                {
                    return 1;
                }
                else
                {
                    return i + Sum4(i-1);
                }
            }
    
    
        }//class program

    问题2

      编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。

    class Program
        {
            //声明两个列表L1 L2
            static object[] str1 = { 'a', 'b', 'c', 'd', 'e' };
            static List<object> L1 = new List<object>(str1);
    
            static object[] str2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            static List<object> L2 = new List<object>(str2);
    
            //合并后的列表
            static List<object> L12 = new List<object>(L1.Count + L2.Count);
    
            static void Main(string[] args)
            {
                //L1+L2
                List<object> result = Combine(L1, L2);
                foreach (object t in result)
                {
                    Console.Write(t + ",");
                }           
                 Console.ReadLine();
            }
    
            static List<object> Combine(List<object> a, List<object> b)
            {
                //两个列表的长度不一样
                List <object > minCountList = a.Count < b.Count ? a : b;
                for (int i = 0; i < minCountList.Count ; i++)
                {
                    L12.Add(minCountList[i]);  //先添加短的list
                    if(minCountList ==a)
                    L12.Add(b[i]);
                    else
                        L12.Add(a[i]);
                }           
                    if (a.Count > b.Count)
                    {
                        for (int j = minCountList.Count; j < a.Count; j++)
                        {
                            L12.Add(a[j]);
                        }              
                    }
                    else
                    {
                        for (int j = minCountList.Count; j < b.Count; j++)
                        {
                            L12.Add(b[j]);
                        }                  
                    }
                    return L12;
            }
        }

    问题3

      编写一个计算前 100 位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是 0 和1,随后的每个数字是前两个数字的和。例如,前 10 位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

    //递归。
     class Program
        {
            static void Main(string[] args)
            {
                while (true )
                {
                    Console.Write("求前n位斐波那契数,请输入正整数n:");
                    int n = Convert.ToInt32(Console.ReadLine());
                    for (int i = 0; i < n; i++)
                    {
                        Console.Write(FBNQ(i).ToString() + " ");
                    }
                    Console.WriteLine("
    ");
                } 
            }
            static double FBNQ(int x)
            {
                if (x == 0)
                    return 0;
                if (x == 1)
                    return 1;
                else
                {
                    return FBNQ(x - 1) + FBNQ(x - 2);
                }
               
            }


    前44位还好,n大了之后,运行很慢。因为函数要调用超多次,一个函数要调用2次。还递归。。。

    改进:

    //迭代 
    static  long lastValue=0;
            static long Fibonacci(int n)
            {
                long t, r;
                if (n == 1)
                {
                    lastValue = 0;
                    return 1;
                }
                else if (n == 2)
                {
                    lastValue = 1;
                    return 1;
                }
                else if (n > 2)
                {
                    t = Fibonacci(n - 1);
                    r = t + lastValue;    //这是Fibonacci(n)的值
                    lastValue = t;
                    return r;
                }
                else
                {
                    lastValue = 0;
                    return 0;
                }
            }  

    运行步骤,假如n=5,先进入n>2, F(4)、接着又F(3)、又F(2)最后再运行 那几个赋值,从n为小的开始往上赋值。

    如果n=33,那么调用Fibonacci方法只有32次。

    问题4

      编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为 95021。

     class Program
        {
            static void Main(string[] args)
            {
                int[] itr = { 7, 13, 92, 50, 23, 38 ,34,28,6};
                Console.WriteLine(SortMax (itr ));
                Console.ReadLine();
            }
            static string  SortMax(int[] a)
            {
                int max = 0;
                int min = 0;
                StringBuilder s = new StringBuilder();
                for (int i = 0; i < a.Length; i++)   //每一趟外循环都把 最大的数放在最前面(这里的大于是这样的: 9>72) 
                {
                    for (int j = i + 1; j < a.Length; j++)
                    {
                        int x = a[i];
                        int y = a[j];
                        int temX = int.Parse(x.ToString() + y.ToString());
                        int temY = int.Parse(y.ToString() + x.ToString());
                        if (temX > temY)
                        {
                            max = x;
                            min = y;
                        }
                        else
                        {
                            max = y;
                            min = x;
                        }
                        a[i] = max;
                        a[j] = min;
                    }
                }
                //前面的代码是排好序。
                for (int i = 0; i < a.Length; i++)
                {
                    s.Append(a[i]+" ");
                }
                return s.ToString();
            }
        }

    问题5

      编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是 100 的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。

    分析: 1-9之间有 8个可能的运算符插入位,。8层循环,每循环有3中可能。 0表没有,1表加法,2表减法。。

    class Program
        {
            static void Main(string[] args)
            {
                int i = 0, qian = 0, hou = 0;//一个运算符连的2个数分别为qian hou
                int ysf = 0;//运算符
                int qh = 0;//当前是qian还是hou的标记 0为qian 1为hou
                int total = 0;//算式结果
                int[] suan = new int[8]; //1-9之间有 8个可能的运算符插入位,0表没有,1表加法,2表减法。。。8层循环,每循环有3种可能。
              
                for (suan[0] = 0; suan[0] < 3; suan[0]++)//1 2间的运算符
                    for (suan[1] = 0; suan[1] < 3; suan[1]++)//2 3间的运算符
                        for (suan[2] = 0; suan[2] < 3; suan[2]++)//3 4间的运算符
                            for (suan[3] = 0; suan[3] < 3; suan[3]++)//4 5间的运算符
                                for (suan[4] = 0; suan[4] < 3; suan[4]++)//5 6间的运算符
                                    for (suan[5] = 0; suan[5] < 3; suan[5]++)//6 7间的运算符
                                        for (suan[6] = 0; suan[6] < 3; suan[6]++)//7 8间的运算符
                                            for (suan[7] = 0; suan[7] < 3; suan[7]++)//8 9间的运算符
                                            {
                                                //重置
                                                qian = 1;//第一个数
                                                ysf = 0;
                                                qh = 0;
                                                total = 0;
                                                //开始运算 。 suan[]有8个数,所以i从0-7
                                                for (i = 0; i < 8; i++)
                                                {
                                                    //无运算符
                                                    if (suan[i] == 0)
                                                    {
                                                        if (qh == 0) qian = qian * 10 + (i + 2);
                                                        else hou = hou * 10 + (i + 2);
                                                    }
                                                    //遇到了新运算符,suan[i]==1或者2
                                                    else
                                                    {
                                                        //完成前一运算符的计算,结果为qian,依然取hou
                                                        if (qh == 1)
                                                        {
                                                            total = qian + ysf * hou;
                                                            qian = total;
                                                            hou = i + 2;
                                                        }
                                                        //开始取hou数
                                                        else
                                                        {
                                                            qh = 1;
                                                            hou = i + 2;
                                                        }
                                                        //更新运算符 
                                                        if (suan[i] == 1)   //1表加法
                                                            ysf = 1;      //代表“+”,ysf*hou
                                                        else            //2表减法
                                                            ysf = -1;     //代表“—”,ysf*hou
                                                    }
                                                }
                                                //完成最后一个运算
                                                total = qian + ysf * hou;
                                                //输出
                                                if (total == 100)
                                                {
                                                    for (i = 0; i < 9; i++)
                                                    {
                                                        Console.Write(i + 1);                                                  
                                                        if (i < 8 && suan[i] == 1)                                               
                                                            Console.Write('+');
                                                        if (i < 8 && suan[i] == 2)                                                     
                                                            Console.Write('-');
                                                    }
                                                    Console.WriteLine("=" + total);                                              
                                                }
                                               
                                            } //for循环
                                               Console.ReadLine();
            }//static void Main(string[] args)
        }

    运行结果:



  • 相关阅读:
    五、nginx 配置实例-负载均衡
    四、nginx配置实例-反向代理
    三、nginx配置文件
    二、Nginx 安装
    十二、rpm包的管理
    十一、进程管理
    十、Linux磁盘分区、挂载
    九、定时任务调度
    八、组管理和权限管理
    七、实用指令
  • 原文地址:https://www.cnblogs.com/peterYong/p/6556682.html
Copyright © 2020-2023  润新知