算法

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

 

=======================順序查找法==========================================

 

 

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

 

 

 

=======================算法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(遞歸計算公式);


 

 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章