=======================冒泡查找法==========================================
=======================順序查找法==========================================
=======================二分查找法==========================================
=======================算法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(遞歸計算公式);