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("\r");
            } 
        }
        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)
    }

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值