今天本人正在看算法方面的書。作為高中數學忘得差不多的渣渣,實在無力。無奈找了本書,c語言寫的,哎。我就把其中代碼翻譯成C#版好了。此坑能否填平,看我耐性和網絡支持條件吧。有生之年能看完的話我會把整個項目上傳的。
那就開坑吧。為了直觀性舍棄代碼規范性,所以如果有人不幸看到,不要吐槽,謝謝。
從第一章開始。
public class _1_1看商品猜價格
{
public void 看商品猜價格()
{
Console.WriteLine( " 設置商品真實價格 ");
int 真正價格 = int.Parse(Console.ReadLine());
Console.WriteLine( " 設置猜測價格 ");
int 猜測價格 = int.Parse(Console.ReadLine());
int 猜測次數 = 1;
while (猜測價格 != 真正價格)
{
猜測次數++;
Console.WriteLine( " 繼續猜 ");
猜測價格 = int.Parse(Console.ReadLine());
}
Console.WriteLine( " 你猜了 " + 猜測次數+ " 次才猜中 ");
// Console.WriteLine(" ");
}
}
public void 看商品猜價格()
{
Console.WriteLine( " 設置商品真實價格 ");
int 真正價格 = int.Parse(Console.ReadLine());
Console.WriteLine( " 設置猜測價格 ");
int 猜測價格 = int.Parse(Console.ReadLine());
int 猜測次數 = 1;
while (猜測價格 != 真正價格)
{
猜測次數++;
Console.WriteLine( " 繼續猜 ");
猜測價格 = int.Parse(Console.ReadLine());
}
Console.WriteLine( " 你猜了 " + 猜測次數+ " 次才猜中 ");
// Console.WriteLine(" ");
}
}
public class _1_2斐波那契數列
{
public long i = 0;
public void 計算斐波那契數列()
{
// 1.3.2 順推實例:斐波那契數列
Console.WriteLine( " 設置N ");
long N = long.Parse(Console.ReadLine());
tailrecursion( 1, 1, N);
// long sum = 0;
// for (long i = 0; i <= N; i++)
// {
// Console.WriteLine(i + " " + sum);
// sum += 斐波那契數列(i);
// }
}
public void tailrecursion( long a, long b, long n)
{
if (n== 0)
{
return;
}
i++;
Console.WriteLine(i + " " + (a + b));
tailrecursion(b,a+b, n - 1);
n--;
}
public long 斐波那契數列( long n)
{
if (n <= 2)
{
return 1;
}
else
{
return 斐波那契數列(n - 1) + 斐波那契數列(n - 2);
}
}
}
public long i = 0;
public void 計算斐波那契數列()
{
// 1.3.2 順推實例:斐波那契數列
Console.WriteLine( " 設置N ");
long N = long.Parse(Console.ReadLine());
tailrecursion( 1, 1, N);
// long sum = 0;
// for (long i = 0; i <= N; i++)
// {
// Console.WriteLine(i + " " + sum);
// sum += 斐波那契數列(i);
// }
}
public void tailrecursion( long a, long b, long n)
{
if (n== 0)
{
return;
}
i++;
Console.WriteLine(i + " " + (a + b));
tailrecursion(b,a+b, n - 1);
n--;
}
public long 斐波那契數列( long n)
{
if (n <= 2)
{
return 1;
}
else
{
return 斐波那契數列(n - 1) + 斐波那契數列(n - 2);
}
}
}
實現了2種
網上那種 計算斐波那契數列的C#實現(注釋的代碼)完全是垃圾!垃圾的地方在於遞歸方法調用2次,在N越來越大的時候非常明顯,而用尾遞歸(tailrecursion
的話飛速算完。不幸的原文用的就是我注釋的那部分方法。
class _1_3用逆推法求最初存錢數
{
public void 求最初存錢數()
{
int 本息 = 1000;
Double 年利率 = 0.0171;
double[] 本利合計 = new double[ 49];
int i;
本利合計[ 48] = 本息;
for ( i = 47;i > 0; i--)
{
本利合計[i] = (本利合計[i + 1] + 本息) / ( 1 + 年利率/ 12);
}
for ( i = 48; i > 0; i--)
{
Console.WriteLine( " 第 "+i+ " 月末本利合計: "+本利合計[i]);
}
}
}
public void 求最初存錢數()
{
int 本息 = 1000;
Double 年利率 = 0.0171;
double[] 本利合計 = new double[ 49];
int i;
本利合計[ 48] = 本息;
for ( i = 47;i > 0; i--)
{
本利合計[i] = (本利合計[i + 1] + 本息) / ( 1 + 年利率/ 12);
}
for ( i = 48; i > 0; i--)
{
Console.WriteLine( " 第 "+i+ " 月末本利合計: "+本利合計[i]);
}
}
}
class _1_4用枚舉法完成填數游戲
{
public void 用枚舉法完成填數游戲()
{
int i1, i2, i3, i4, i5;
long multi, result;
for (i1 = 1; i1 <= 9; i1++)
{
for (i2 = 0; i2 <= 9; i2++)
{
for (i3 = 0; i3 <= 9; i3++)
{
for (i4 = 0; i4 <= 9; i4++)
{
for (i5 = 1; i5 <= 9; i5++)
{
multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
result = i5 * 111111;
if (multi * i1 == result)
{
Console.WriteLine(i1 + "" + i2 + "" + i3 + "" + i4 + "" + i5);
Console.WriteLine( " X " + i1);
Console.WriteLine( " ____________ ");
Console.WriteLine(i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5);
}
}
}
}
}
}
}
}
public void 用枚舉法完成填數游戲()
{
int i1, i2, i3, i4, i5;
long multi, result;
for (i1 = 1; i1 <= 9; i1++)
{
for (i2 = 0; i2 <= 9; i2++)
{
for (i3 = 0; i3 <= 9; i3++)
{
for (i4 = 0; i4 <= 9; i4++)
{
for (i5 = 1; i5 <= 9; i5++)
{
multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
result = i5 * 111111;
if (multi * i1 == result)
{
Console.WriteLine(i1 + "" + i2 + "" + i3 + "" + i4 + "" + i5);
Console.WriteLine( " X " + i1);
Console.WriteLine( " ____________ ");
Console.WriteLine(i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5 + "" + i5);
}
}
}
}
}
}
}
}
1-6使用遞歸算法計算階乘
int i;
Console.WriteLine( " 請輸入要求階乘的一個整數: ");
i = int.Parse(Console.ReadLine());
Console.WriteLine(i+ " 的階乘結果為: "+fact(i));
}
int fact( int n)
{
if (n <= 1)
return 1;
else
return n * fact(n - 1);
}
Console.WriteLine( " 請輸入要求階乘的一個整數: ");
i = int.Parse(Console.ReadLine());
Console.WriteLine(i+ " 的階乘結果為: "+fact(i));
}
int fact( int n)
{
if (n <= 1)
return 1;
else
return n * fact(n - 1);
}
1_8兵乓球比賽日程安排
int[,] a =
new
int[
65,
65];
public void Run()
{
int m, i, j;
Console.WriteLine( " 輸入參賽選手人數: ");
m = int.Parse(Console.ReadLine());
j = 2;
for (i = 2; i < 8; i++)
{
j = j * 2;
if (j == m)
break;
}
if (i >= 8)
{
Console.Write( " 參賽選手人數必須為2的整數次冪,且不超過64!\n ");
}
gamecal( 1, m);
Console.Write( " \n編號 ");
for (i = 2; i <= m; i++)
{
Console.Write( i - 1+ " 天 ");
}
Console.WriteLine( " \n ");
for (i = 1; i <= m; i++)
{
for (j = 1; j <= m; j++)
Console.Write( " " + a[i, j] + " ");
Console.Write( " \n ");
}
}
private void gamecal( int k, int n)
{
int i, j;
if (n == 2)
{
a[k, 1] = k; // 參賽選手編號
a[k, 2] = k + 1; // 對陣選手編號
a[k + 1, 1] = k + 1; // 參賽選手編號
a[k + 1, 2] = k; // 對陣選手編號
}
else
{
gamecal(k, n / 2);
gamecal(k + n / 2, n / 2);
for (i = k; i < k + n / 2; i++) // 填充右上角
{
for (j = n / 2 + 1; j <= n; j++)
{
a[i, j] = a[i + n / 2, j - n / 2];
}
}
for (i = k + n / 2; i < k + n; i++) // 填充左下角
{
for (j = n / 2 + 1; j <= n; j++)
{
a[i, j] = a[i - n / 2, j - n / 2];
}
}
}
}
public void Run()
{
int m, i, j;
Console.WriteLine( " 輸入參賽選手人數: ");
m = int.Parse(Console.ReadLine());
j = 2;
for (i = 2; i < 8; i++)
{
j = j * 2;
if (j == m)
break;
}
if (i >= 8)
{
Console.Write( " 參賽選手人數必須為2的整數次冪,且不超過64!\n ");
}
gamecal( 1, m);
Console.Write( " \n編號 ");
for (i = 2; i <= m; i++)
{
Console.Write( i - 1+ " 天 ");
}
Console.WriteLine( " \n ");
for (i = 1; i <= m; i++)
{
for (j = 1; j <= m; j++)
Console.Write( " " + a[i, j] + " ");
Console.Write( " \n ");
}
}
private void gamecal( int k, int n)
{
int i, j;
if (n == 2)
{
a[k, 1] = k; // 參賽選手編號
a[k, 2] = k + 1; // 對陣選手編號
a[k + 1, 1] = k + 1; // 參賽選手編號
a[k + 1, 2] = k; // 對陣選手編號
}
else
{
gamecal(k, n / 2);
gamecal(k + n / 2, n / 2);
for (i = k; i < k + n / 2; i++) // 填充右上角
{
for (j = n / 2 + 1; j <= n; j++)
{
a[i, j] = a[i + n / 2, j - n / 2];
}
}
for (i = k + n / 2; i < k + n; i++) // 填充左下角
{
for (j = n / 2 + 1; j <= n; j++)
{
a[i, j] = a[i - n / 2, j - n / 2];
}
}
}
}
1-9用貪婪算法求找零錢
View Code
1-11用試探法生成彩票組合
View Code
1-12模擬法猜數游戲
View Code
1-13模擬法擲骰子游戲
View Code
DDD