=======================冒泡查找法==========================================
=======================顺序查找法==========================================
=======================二分查找法==========================================
=======================算法Demo==========================================
求1!+2!+3!+4!+...........+20!(用函数嵌套来做)
static void Main()
{
Console.WriteLine("1!+2!+3!+4!
+...........+20!={0}",Sum(20));
}
static int Sum(int n)
{
int i;
int jC = 1, sum = 0;
for (i = 1; i <= n; i++)
{
jC *= i;
sum += jC;
}
return sum;
}
9:用递归的方法将整型数按高到低位输出相应的数字字符.
static void Fun(int k)
{
int m;
Console.WriteLine("{0}",k % 10);
m = k / 10;
if (m!=0)
{
Fun(m);
}
}
static void Main()
{
Fun(12);
}//从低位到高位输出。
static void Fun(int k)
{
int n;
n = k / 10;
if (n!=0)
{
Fun(n);
}
Console.WriteLine("{0}",k%10);
}
static void Main()
{
Fun(12);
}//从高位到低位输出
10:求以下数列前20项之
和:2/1,3/2,5/3,8/5,13/8,21/13.........
static void Main()
{
Fb(5);
}
static void Fb(int x)
{
int m, n, fz = 2, fm = 1;
int sum = 0;
for (int i = 1; i <=x; i++)
{
n = fz / fm;
sum += n;
m = fz + fm;
fm = fz;
fz = m;
}
Console.WriteLine("2/1+3/2+5/3+8/5+13/8+
21/13...的和={0}", sum);
或者:
//static void Fb(int[] a,int n)
//{
// int sum = 0;
// for (int i = 2; i <n+2; i++)
// {
// sum += a[i] / a[i - 1];
// }
// Console.WriteLine("2/1+3/2+5/3+8/5+
13/8+21/13...的和={0}", sum);
//}
//static void Main()
//{
// int m;
// Console.WriteLine("请输入任意的项
数:");
// m = int.Parse(Console.ReadLine());
// int[] b=new int[m+2];
// b[0] = 1;
// b[1] = 1;
// for (int i = 2; i <m+2; i++)
// {
// b[i]=b[i-1]+b[i-2];
// }
// Fb(b,m);
//}
}
上课练习答案:
1、典型实例一:求孪生质数
【实例题目】
编写程序求出100之内的所有孪生质数,所谓孪生质数是指两个
质数,它们的差为2,如5和7、11和13等都是孪生质数。要
求:判断某数是否为质数要用一个方法来实现。(质数就是素
数)
static void Main(string[] args)
{
for (int j = 2; j < 98; j++)
{
if ((Luanzhi(j)==1)&&(Luanzhi(j+
2)==1))
{
Console.WriteLine("孪生质数
:{0}和{1}",j,j+2);
}
}
}
static int Luanzhi(int number)
{
for (int i = 2; i <= number / 2;i++ )
{
if (number%i==0)
{
return 0;
}
}
return 1;
}
2、典型实例二:校园歌手评分
【实例题目】
某学校要举办校园歌手大奖赛,现在要让计算机为选手评分,
评分原则为:从若干个评委的打分中去掉一个最低分去掉一个
最高分,剩下的得分取平均即是选手的得分。要求:根据评委
的打分求出选手的得分需编写成一个方法。
static void Score(double[] a)
{
double max, min,sum;
max=a[0];
min=a[0];
sum=a[0];
for (int i = 1; i <a.Length; i++)
{
sum += a[i];
if (max<a[i])
{
max=a[i];
}
if (min>a[i])
{
min=a[i];
}
}
Console.WriteLine("此选手的最后得分是:
{0}",(sum-max-min)/(a.Length-2));
}
static void Main(string[] args)
{
Console.WriteLine("请输入评委的人数:");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("请输入评委的打分:");
double[] df=new double[n];
for (int i = 0; i <df.Length; i++)
{
Console.WriteLine("请输入第{0}个评委
的打分:",i+1);
df[i] = double.Parse
(Console.ReadLine());
}
Score(df);
}
3、求两个正整数的最大公约数与最小公倍数
【练习题目】
编写一个方法,该方法的功能是用辗转除余法求两个数的最大
公约数和最小公倍数。(最小公倍数是两数的积除以最大公约
数)
static void ZuiG(int u,int v)
{
int r;
int m = u;
int n = v;
while (v!=0)
{
r = u % v;
u = v;
v = r;
}
Console.WriteLine("{0}和{1}的最大公约数
是:{2}",m,n,u);
Console.WriteLine("{0}和{1}的最小公倍数
是:{2}", m, n,(m*n)/u);
}
static void Main(string[] args)
{
Console.WriteLine("请输入任意两个正整
数:");
int x = int.Parse(Console.ReadLine());
int y = int.Parse(Console.ReadLine());
ZuiG(x,y);
}
补充:
4:求s=a+aa+aaa+........+aaaaaaa(n个a)的值,
其中a是一个数字.例如2+22+222+.....2222222(7),n由键盘
输入.
static int Sum(int a, int n)
{
int i, s = 0, m = a;
for (i = 1; i <= n; i++)
{
s += a;
a = a * 10 + m;
}
return s;
}
static void Main()
{
int a, n;
Console.WriteLine("请输入a,n的值:");
a = int.Parse(Console.ReadLine());
n = int.Parse(Console.ReadLine());
Console.WriteLine
("a+aa+aaa+.....aaaaaaa..(n)={0}", Sum(a, n));
}
--------------------------------------上面 有不对的话
看下面
//任意一个数从高位到低位输出
//static void Fun(int k)
//{
// int n;
// n = k / 10;
// if (n!=0)
// {
// Fun(n);
// }
// Console.WriteLine("{0}",k%10);
//}
//static void Main()
//{
// Fun(629);
//}
//任意一个数从低位到高位输出
//static void Fun(int k)
//{
// int n;
// Console.WriteLine("{0}", k % 10);
// n = k / 10;
// if (n != 0)
// {
// Fun(n);
// }
//}
//static void Main()
//{
// Fun(95639);
//}
//求这个数列前20项的和:
2/1,3/2,5/3,8/5,13/8,21/13.........
//static void Main()
//{
// Fb(5);
//}
//static void Fb(int x)
//{
// int m, n, fz = 2, fm = 1;
// int sum = 0;
// for (int i = 1; i <=x; i++)
// {
// n = fz / fm;
// sum += n;
// m = fz + fm;
// fm = fz;
// fz = m;
// }
// Console.WriteLine("2/1+3/2+5/3+8/5+
13/8+21/13...的和={0}", sum);
//}
//另外一种做法:
//static void Fb(int[] a,int n)
//{
// int sum = 0;
// for (int i = 2; i <n+2; i++)
// {
// sum += a[i] / a[i - 1];
// }
// Console.WriteLine("2/1+3/2+5/3+8/5+
13/8+21/13...的和={0}", sum);
//}
//static void Main()
//{
// int m;
// Console.WriteLine("请输入任意的项
数:");
// m = int.Parse(Console.ReadLine());
// int[] b=new int[m+2];
// b[0] = 1;
// b[1] = 1;
// for (int i = 2; i <m+2; i++)
// {
// b[i]=b[i-1]+b[i-2];
// }
// Fb(b,m);
//}
//请您输入10个同学的成绩并排名:
//static void Mci(int[] a)
//{
// int i, j, p = 0, temp;
// for (i = 0; i < a.Length-1; i++)
// {
// p = i;
// for (j = i + 1; j < a.Length; j++)
// {
// if (a[p] < a[j])
// {
// p = j;//p始终使最大的数
// }
// }
// if (p != i)
// {
// temp = a[p];
// a[p] = a[i];
// a[i] = temp;
// }
// }
// Console.WriteLine("排序后的数组是:");
// for (i = 0; i < 10; i++)
// {
// Console.WriteLine("a[{0}]={1}",i,
a[i]);
// }
//}
//static void Main()
//{
// int i;
// int[] score = new int[10];
// Console.WriteLine("请您输入10个同学的成
绩:");
// for (i = 0; i < 10; i++)
// {
// Console.WriteLine("请您输入第{0}位
同学的成绩", i + 1);
// score[i] = int.Parse
(Console.ReadLine());
// }
// Console.WriteLine("排序前的数组是:");
// for (i = 0; i < 10; i++)
// {
// Console.WriteLine("score[{0}]=
{1}",i, score[i]);
// }
// Console.WriteLine();
// Mci(score);
//}
//static int Fact(int n) /* 求阶乘的函数*/
//{
// int m;
// if (n==1)
// {
// return 1;
// }
// else
// {
// m = n*Fact(n-1);
// }
// return m;
//}
//static void Main()
//{
// Console.WriteLine(Fact(4));
//}
//编写程序求出100之内的所有孪生质数,所谓孪生
质数是指两个质数,
//它们的差为2,如5和7、11和13等都是孪生质数。
//要求:判断某数是否为质数要用一个方法来实现。
//static void Main(string[] args)
//{
// for (int j = 2; j < 98; j++)
// {
// if ((Luanzhi(j)==1)&&(Luanzhi
(j+2)==1))
// {
// Console.WriteLine("孪生质
数 :{0}和{1}",j,j+2);
// }
// }
//}
//static int Luanzhi(int number)
//{
// for (int i = 2; i <= number / 2;i++
)
// {
// if (number%i==0)
// {
// return 0;
// }
// }
// return 1;
//}
//2、典型实例二:校园歌手评分
//【实例题目】
//某学校要举办校园歌手大奖赛,现在要让计算机为
选手评分,
//评分原则为:从若干个评委的打分中去掉一个最低
分去掉
//一个最高分,剩下的得分取平均即是选手的得分。
要求:
//根据评委的打分求出选手的得分需编写成一个方
法。
//static void Score(double[] a)
//{
// double max, min,sum;
// max=a[0];
// min=a[0];
// sum=a[0];
// for (int i = 1; i <a.Length; i++)
// {
// sum += a[i];
// if (max<a[i])
// {
// max=a[i];
// }
// if (min>a[i])
// {
// min=a[i];
// }
// }
// Console.WriteLine("此选手的最后得分是:
{0}",(sum-max-min)/(a.Length-2));
//}
//static void Main(string[] args)
//{
// Console.WriteLine("请输入评委的人
数:");
// int n = int.Parse(Console.ReadLine());
// Console.WriteLine("请输入评委的打
分:");
// double[] df=new double[n];
// for (int i = 0; i <df.Length; i++)
// {
// Console.WriteLine("请输入第{0}个评
委的打分:",i+1);
// df[i] = double.Parse
(Console.ReadLine());
// }
// Score(df);
//}
//3、求两个正整数的最大公约数与最小公倍数
//【练习题目】
//编写一个方法,
//该方法的功能是用辗转除余法求两个数的最大公约
数和最小公倍数。
//static void ZuiG(int u,int v)
//{
// int r;
// int m = u;
// int n = v;
// while (v!=0)
// {
// r = u % v;
// u = v;
// v = r;
// }
// Console.WriteLine("{0}和{1}的最大公约数
是:{2}",m,n,u);
// Console.WriteLine("{0}和{1}的最小公倍数
是:{2}", m, n,(m*n)/u);
//}
//static void Main(string[] args)
//{
// Console.WriteLine("请输入任意两个正整
数:");
// int x = int.Parse(Console.ReadLine());
// int y = int.Parse(Console.ReadLine());
// ZuiG(x,y);
//}
//static int Sum(int a, int n)
//{
// int i, s = 0, m = a;
// for (i = 1; i <= n; i++)
// {
// s += a;
// a = a * 10 + m;
// }
// return s;
//}
//static void Main()
//{
// int a, n;
// Console.WriteLine("请输入a,n的值:");
// a = int.Parse(Console.ReadLine());
// n = int.Parse(Console.ReadLine());
// Console.WriteLine
("a+aa+aaa+.....aaaaaaa..(n)={0}", Sum(a, n));
//}
//static void Main()
//{
// Console.WriteLine("1!+2!+3!+4!
+...........+20!={0}",Sum(20));
//}
//static int Sum(int n)
//{
// int i;
// int jC = 1, sum = 0;
// for (i = 1; i <= n; i++)
// {
// jC *= i;
// sum += jC;
// }
// return sum;
//}
-------------------------------------------
将一个十进制正整数转换为二进制整数形式的字符
static public void Awap(int m)
{
int n;
n = m / 2;
if (n!=0)
{
Awap(n);
}
Console.Write(m % 2);
}
static void Main(string[] args)
{
Awap(15);
}
(利用循环语句)
static void Main()
{
int m,n;
m = int.Parse(Console.ReadLine());
n=m;
int t =0;
while (m!=0)
{
m = m / 2;
t++;
}
int[] a=new int[t];
for (int i = 0; i <a.Length; i++)
{
a[i] = n % 2;
n = n / 2;
}
for (int j = a.Length-1; j>=0; j--)
{
Console.Write(a[j]);
}
}
将10到20之间的数分解成素数的和。
//static void Main(string[] args)
//{
// int oushu;
// //Console.WriteLine("请输入一个偶数:");
// //oushu=int.Parse(Console.ReadLine());
// for (int j = 10; j <=20; j+=2)
// {
// oushu = j;
// Console.WriteLine("偶数{0}的分
解:",j);
// for (int i = 2; i < oushu; i++)
// {
// if ((oushu - i) != 1)
// {
// if ((Func(i) == 1) &&
(Func(oushu - i) == 1))
// {
// Console.WriteLine("偶
数:{0}=素数:{1}+{2}", oushu, i, oushu - i);
// }
// }
// }
// }
//}
//static int Func(int x)
//{
// for (int i = 2; i <=x/2; i++)
// {
// if (x%i==0)
// {
// return 0;
// }
// }
// return 1;
//}
====================================递归
一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
//if (i <= 0)
//return 0; 把这两行注释了吧,看来大家的眼睛是雪亮的,希望各位高手多指教。
if(i > 0 && i <= 2)
return 1;
else
return Foo(i -1) + Foo(i - 2);
}
--------------------------------------------
方法的递归调用
1、C#语言中还允许方法直接或间接调用自身,并且把这种直接或间接调用
自身的方法称为递归方法。
分析:
题目的解法就是,当求5的阶乘的时候,就转换为5!=5*4!,问题就变成
了求4
的阶乘了;求4的阶乘的时候,就转换为4!=4*3!,问题又转化为求3的阶
乘了;这个过程会继续下去,直到要求1的阶乘。因为只有求1的阶乘的时
候,能返回一个明确的数字1来,所以,递归类问题的特点就是:要想解决
当前问题,需要解决类似的另一个问题,这个过程会有一个重复性,直到
找到一个肯定性的答案进行问题的回推就行了。
static int Fact(int n) /* 求阶乘的函数*/
{
int m;
if(n>1)
{
m=n*Fact(n-1);
}/*递归调用,当n>1时,一直会调用下去,只不过每次参数被减1*/
else
{
return 1;
}/*当 n被减到1时,返回1,于是会被累积,当n初始为1时,直接返回1*/
return m; /*m是我们当n>1时,我们最后要的结果*/
}
static void Main()
{
int n1;
int n2;
Console.WriteLine("输入一个正整数:");
n1=int.Parse(Console.ReadLine());
if(n1>0)
{
n2=Fact(n1);
Console.WriteLine("{0}的阶乘为{1}",n1,n2);
}
else
{
Console.WriteLine("输入数字不合法!");
}
}
2、我们看下面一个求年龄的问题。
有5个人坐在一起聊天,问第5个人他多大了,他说第4个人大2岁;
又问第4个人多大了,他说比第3个人大2岁;问第3个人多大了,他说比第2
个人大2岁;问第2个人多大了,他说比第1个人大2岁;问第1个人多大了,
他说是15岁。请问,第5个人多大了。
分析
这显然也是一个递归问题,每个人的年龄(Age)都取决于他前面的人的年
龄,而且,这里面是有规律的,就是每个人的年龄都比他前一个人的年龄
大2岁。我们可以写为:
Age(5)= Age(4)+2
Age(4)= Age (3)+2
Age(3)= Age (2)+2
Age(2)= Age (1)+2
Age(1)= 15
因此可以用式子表达如下:
分析
解决该问题分两个阶段:
1)回推,即将第n个人的年龄表示为第n-1个人的年龄的函数。而当第n-1个
人的年龄也是一个不确定的数字的时候,还要回推到第n-2个人的年龄,直
到第1个人的年龄。这时候age(1) 是已知数字,就不必再回推了。
2)递推,从第1个人的年龄推算出第2个人的年龄,再根据第2个人的年龄
推算出第3个人的年龄…,一直推算出第5个人的年龄为止。
因此,一个递归问题可以分解为“回推”和“递推”两个阶段。要经
过许多步才能求出最后的结果。显然,必须有结束递归过程的条
件,例如:本题目中的Age(1)=15,就是使递归结束的条件。
代码:
static void Main()
{
int age1;
age1=Age(5); /*调用求年龄的函数*/
Console.WriteLine("第5个人的年龄是{0}",age1);
/*因为Age()函数是一个返回整型数的函数,因此也定义age1 这个整型变
量,也可以直接写为:Console.WriteLine(“第5个人的年龄是{0}",Age(5));*/
}
static int Age(int a)
{
int n;
if(a==1)
{
n=15;
}
else
{
n=Age(a-1)+2;
}
return n;
}
总的来说,递归算法简单而自然,源代码的结构简练,便于阅读,对于那
些可以采用递归算法实现的函数,都可以利用递归调用实现。
3、若干个人排成一个队领苹果,已知第一个人的领的苹果数为1个,从第
二个人开始每个人领的苹果数是前一个人领的苹果数的2倍再加3,问第n个
人领了多少个苹果?
分析:
一般来说如果某个问题能够用递归来求解,该问题一定能够归结成一个函
数公式,如本题求第n个人领的苹果数,用函数apple(n)表示,则本题的apple
(n)可描述如下。
从程序设计的角度来说,递归过程必须解决两个问题:一是递归计算的公
式,二是递归结束的条件。本题可以写成:
递归计算公式: apple (n)=2* apple (n-1)+3 n>1
递归结束条件: apple (1)=1
凡是能够表示成上述式子的数学问题均可以用递归来实现,在递归函数中
一般可采用双分支语句来实现:
if(递归结束条件) return(递归终止值);
else return(递归计算公式);