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