算法

=======================冒泡查找法==========================================

 

=======================顺序查找法==========================================

 

 

=======================二分查找法==========================================

 

 

 

=======================算法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(递归计算公式);


 

 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值