常见算法的实际应用

判断素数的算法
int j;
j = (int)Math.Ceiling(Math.Sqrt(Convert.ToDouble(textBox1.Text)));//开方
for (int i = 1; i < j; i++)//遍历当前值
{
if (Math.IEEERemainder(Convert.ToDouble(textBox1.Text), i) == 0)//取整
{
label2.Text = "不是素数";
}
else
{
label2.Text = "是素数";
}
}
身份证号从15位升到18位的算法
public string Shen(string id)
{
int[] w = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
char[] a = new char[] { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' }; //设置18位最后一位的值
string newID = "";
if (id.Length == 15) //判断位数
{
int s = 0;
newID = id.Insert(6, "19"); //插入字符串
for (int i = 0; i < 17; i++) //生成前17位
{
int k = Convert.ToInt32(newID[i]) * w[i];
s = s + k;
}
int h = 0;
Math.DivRem(s, 11, out h); //取余数
newID = newID + a[h]; //生成18位
}
return newID;
}
歌德巴赫猜想的算法实现
static bool IsPrimeNumber(int intNum)
{
bool blFlag = true; //标识是否是素数
if (intNum == 1 || intNum == 2) //判断输入的数字是否是1或者2
blFlag = true; //为bool类型变量赋值
else
{
int sqr = Convert.ToInt32(Math.Sqrt(intNum)); //对要判断的数字进行开方运算
for (int i = sqr; i >= 2; i--) //从开方后的数进行循环
{
if (intNum % i == 0) //对要判断的数字和指定数字进行求余运算
{
blFlag = false; //如果余数为0,说明不是素数
}
}
}
return blFlag; //返回bool型变量
}
static bool ISGDBHArith(int intNum)
{
bool blFlag = false; //标识是否符合哥德巴赫猜想
if (intNum % 2 == 0 && intNum > 6) //对要判断的数字进行判断
{
for (int i = 1; i <= intNum / 2; i++)
{
bool bl1 = IsPrimeNumber(i); //判断i是否为素数
bool bl2 = IsPrimeNumber(intNum - i); //判断intNum-i是否为素数
if (bl1 & bl2)
{
//输出等式
Console.WriteLine("{0}={1}+{2}", intNum, i, intNum - i);
blFlag = true; //符合哥德巴赫猜想
}
}
}
return blFlag; //返回bool型变量
}
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
#region 解决八皇后问题
/// <summary>
/// 解决八皇后问题
/// </summary>
/// <param name="size">皇后数量</param>
static void QueenArithmetic(int size)
{
int[] Queen = new int[size];//每行皇后的位置
int y, x, i, j, d, t = 0;
y = 0;
Queen[0] = -1;
while (true)
{
for (x = Queen[y] + 1; x < size; x++)
{
for (i = 0; i < y; i++)
{
j = Queen[i];
d = y - i;
//检查新皇后是否能与以前的皇后相互攻击
if ((j == x) || (j == x - d) || (j == x + d))
break;
}
if (i >= y)
break;//不攻击
}
if (x == size) //没有合适的位置
{
if (0 == y)
{
//回溯到了第一行
Console.WriteLine("Over");
break; //结束
}
//回溯
Queen[y] = -1;
y--;
}
else
{
Queen[y] = x;//确定皇后的位置
y++;//下一个皇后
if (y < size)
Queen[y] = -1;
else
{
//所有的皇后都排完了,输出
Console.WriteLine(" " + ++t + ':');
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
Console.Write(Queen[i] == j ? 'Q' : '*');
Console.WriteLine();
}
y = size - 1;//回溯
}
}
}
Console.ReadLine();
}
#endregion
百钱百鸡的算法实现
公鸡5元一只,母鸡3元一只,小鸡3只一元,用100元买100只鸡
int a = 0, b = 0, c = 0, p = 0;//定义变量
for (a = 1; a <= 19; a++)//公鸡的百元中的遍历
{
for (b = 1; b <= 33; b++)//母鸡在百元中的遍历
{
c = 100 - a - b;//获取百中除了公鸡和母鸡后,小鸡的总钱数
Math.DivRem(c, 3, out p);//计算小鸡的个数
if (((5 * a + 3 * b + c / 3) == 100) && p == 0)//如果公鸡、母鸡和小鸡的总钱数加起来为100
{
textBox1.Text = a.ToString();//显示公鸡的个数
textBox2.Text = b.ToString();//显示母鸡的个数
textBox3.Text = c.ToString();//显示小鸡的个数
return;
}
}
}
韩信点兵是一道古代数学题,内容是:韩信带兵不足百人,三人一行排列多一个,七人一行排列少两个,五人一行排列正好。
int a = 0, b = 0, c = 0;//定义变量
for (int i = 1; i < 100; i++)//遍历
{
Math.DivRem(i, 3, out a);//3行一列时取余
Math.DivRem(i, 5, out b);//5行一列时取余
Math.DivRem(i, 7, out c);//7行一列时取余
if (a == 1 && b == 0 && c == 5)//如果3种方式的余数符合要求
{
textBox1.Text = i.ToString();//显示人数
return;
}
}
水仙花数的算法是一个三位数,每一位数的立方相加等于该数本身。
int a = 0, b = 0, c = 0;//定义变量
listBox1.Items.Clear();//清空listBox1控件
for (int i = 100; i <= 1000; i++)//遍历所有3位数
{
a = i / 100;//获取3位数中的第一个数
Math.DivRem(i, 100, out b);//获取3位数中的后两位数
b = b / 10;//获取3位数中的第二位数
Math.DivRem(i, 10, out c);//获取3位数中的第3位数
a = a * a * a;//计算第一位数的立方
b = b * b * b;//计算第二位数的立方
c = c * c * c;//计算第3位数的立方
if ((a + b + c) == i)//如果符合水仙花数
listBox1.Items.Add(i.ToString());//显示当前3位数
}
约瑟夫环问题的算法实现
#region 约瑟夫环问题算法
/// <summary>
/// 约瑟夫环问题算法
/// </summary>
/// <param name="total">总人数</param>
/// <param name="start">开始报数的人</param>
/// <param name="alter">要出列的人</param>
/// <returns>返回一个int类型的一维数组</returns>
static int[] Jose(int total, int start, int alter)
{
int j, k = 0;
//intCounts数组存储按出列顺序的数据,以当结果返回
int[] intCounts = new int[total + 1];
//intPers数组存储初始数据
int[] intPers = new int[total + 1];
//对数组intPers赋初值,第一个人序号为0,第二人为1,依此下去
for (int i = 0; i < total; i++)
{
intPers[i] = i;
}
//按出列次序依次存于数组intCounts中
for (int i = total; i >= 2; i--)
{
start = (start + alter - 1) % i;
if (start == 0)
start = i;
intCounts[k] = intPers[start];
k++;
for (j = start + 1; j <= i; j++)
intPers[j - 1] = intPers[j];
}
intCounts[k] = intPers[1];
//结果返回
return intCounts;
}
#endregion
杨辉三角算法
public void yanghui(int value)
{
if (value < 3)
{
Console.WriteLine("请重新输入数组大于3的值!");
}
else
{
int[,] arry = new int[value, value];
Console.WriteLine("数组为:");
for (int i = 0; i < value; i++)
{
string str = "";
str = str.PadLeft(value - i);
Console.Write(str);
for (int j = 0; j <= i; j++)
{
if (i == j || j == 0)
{
arry[i, j] = 1;
}
else
{
arry[i, j] = arry[i - 1, j - 1] + arry[i - 1, j];
}
Console.Write(arry[i, j] + " ");
}
Console.WriteLine();
}
}
}
恺撒密码算法的实现
//获取字符的ASCII码
public int AscII(string str)
{
byte[] array = new byte[1];//创建字节数组
array = System.Text.Encoding.ASCII.GetBytes(str);//为字节数组赋值
int asciicode = (short)(array[0]);//获取字节数组的第一项
return asciicode;//返回字节数组的第一项
}
public string Caesar(string str)//凯撒加密算法的实现
{
char[] c = str.ToCharArray();//创建字符数组
string strCaesar = "";//定义一个变量,用来存储加密后的字符串
for (int i = 0; i < str.Length; i++)//遍历字符串中的每一个字符串
{
string ins = c[i].ToString();//记录遍历到的字符
string outs = "";//定义一个变量,用来记录加密后的字符串
bool isChar = "0123456789abcdefghijklmnopqrstuvwxyz".Contains(ins.ToLower());//判断指定的字符串中是否包含遍历到的字符
bool isToUpperChar = isChar && (ins.ToUpper() == ins);//判断遍历到的字符是否是大写
ins = ins.ToLower();//将遍历到的字符转换为小写
if (isChar)//判断指定的字符串中是否包含遍历到的字符
{
int offset = (AscII(ins) + 5 - AscII("a")) % (AscII("z") - AscII("a") + 1);//获取字符的ASCII码
outs = Convert.ToChar(offset + AscII("a")).ToString();//转换为字符并记录
if (isToUpperChar)//判断是否大写
{
outs = outs.ToUpper();//全部转换为大写
}
}
else
{
outs = ins;//记录遍历的字符
}
strCaesar += outs;//添加到加密字符串中
}
return strCaesar;//返回加密后的字符串
}
static void Main(string[] args)
{
while (true)
{
Console.Write("请输入密码:");
string P_str_Code = Console.ReadLine();//记录要加密的密码
Program program = new Program();//创建Program对象
Console.WriteLine("使用凯撒算法加密后的结果为:" + program.Caesar(P_str_Code));//输出加密后的字符串
}
}

原文地址:https://www.cnblogs.com/jxyZ/p/3197066.html