题目来自于博客园: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) }
运行结果: