今天本人正在看算法方面的书。作为高中数学忘得差不多的渣渣,实在无力。无奈找了本书,c语言写的,哎。我就把其中代码翻译成C#版好了。此坑能否填平,看我耐性和网络支持条件吧。有生之年能看完的话我会把整个项目上传的。
那就开坑吧。为了直观性舍弃代码规范性,所以如果有人不幸看到,不要吐槽,谢谢。
从第一章开始。
public class _1_1看商品猜价格
{ public void 看商品猜价格() { Console.WriteLine("设置商品真实价格"); int 真正价格 = int.Parse(Console.ReadLine()); Console.WriteLine("设置猜测价格"); int 猜测价格 = int.Parse(Console.ReadLine()); int 猜测次数 = ; while (猜测价格 != 真正价格) { 猜测次数++; Console.WriteLine("继续猜"); 猜测价格 = int.Parse(Console.ReadLine()); } Console.WriteLine("你猜了" + 猜测次数+"次才猜中"); //Console.WriteLine(" "); } }
public class _1_2斐波那契数列
{ public long i = ; public void 计算斐波那契数列() { //1.3.2 顺推实例:斐波那契数列 Console.WriteLine("设置N"); long N = long.Parse(Console.ReadLine()); tailrecursion(, , 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==) { return; } i++; Console.WriteLine(i + " " + (a + b)); tailrecursion(b,a+b, n - ); n--; } public long 斐波那契数列(long n) { if (n <= ) { return ; } else { return 斐波那契数列(n - ) + 斐波那契数列(n - ); } } }
实现了2种
网上那种 计算斐波那契数列的C#实现(注释的代码)完全是垃圾!垃圾的地方在于递归方法调用2次,在N越来越大的时候非常明显,而用尾递归(tailrecursion
的话飞速算完。不幸的原文用的就是我注释的那部分方法。
class _1_3用逆推法求最初存钱数
{ public void 求最初存钱数() { int 本息 = ; Double 年利率 = 0.0171; double[] 本利合计 =new double[]; int i; 本利合计[] = 本息; for ( i = ;i > ; i--) { 本利合计[i] = (本利合计[i + ] + 本息) / ( + 年利率/); } for ( i = ; i > ; i--) { Console.WriteLine("第"+i+"月末本利合计:"+本利合计[i]); } } }
class _1_4用枚举法完成填数游戏
{ public void 用枚举法完成填数游戏() { int i1, i2, i3, i4, i5; long multi, result; for (i1 = ; i1 <= ; i1++) { for (i2 = ; i2 <= ; i2++) { for (i3 = ; i3 <= ; i3++) { for (i4 = ; i4 <= ; i4++) { for (i5 = ; i5 <= ; i5++) { multi = i1 * + i2 * + i3 * + i4 * + i5; result = i5 * ; 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 <= )
return ;
else
return n * fact(n - );
}
1_8兵乓球比赛日程安排
int[,] a = new int[, ];
public void Run()
{
int m, i, j;
Console.WriteLine("输入参赛选手人数:");
m = int.Parse(Console.ReadLine());
j = ;
for (i = ; i < ; i++)
{
j = j * ;
if (j == m)
break;
}
if (i >= )
{
Console.Write("参赛选手人数必须为2的整数次幂,且不超过64!\n");
}
gamecal(, m);
Console.Write("\n编号");
for (i = ; i <= m; i++)
{
Console.Write( i - +"天 ");
}
Console.WriteLine("\n");
for (i = ; i <= m; i++)
{
for (j = ; j <= m; j++)
Console.Write(" " + a[i, j] + " ");
Console.Write("\n");
}
}
private void gamecal(int k, int n)
{ int i, j;
if (n == )
{
a[k, ] = k; //参赛选手编号
a[k, ] = k + ; //对阵选手编号
a[k + , ] = k + ; //参赛选手编号
a[k + , ] = k; //对阵选手编号
}
else
{
gamecal(k, n / );
gamecal(k + n / , n / );
for (i = k; i < k + n / ; i++) //填充右上角
{
for (j = n / + ; j <= n; j++)
{
a[i, j] = a[i + n / , j - n / ];
}
}
for (i = k + n / ; i < k + n; i++) //填充左下角
{
for (j = n / + ; j <= n; j++)
{
a[i, j] = a[i - n / , j - n / ];
}
}
}
}
1-9用贪婪算法求找零钱
1-11用试探法生成彩票组合
1-12模拟法猜数游戏
1-13模拟法掷骰子游戏
DDD