zoukankan      html  css  js  c++  java
  • 常见算法的实际应用

    判断素数的算法
    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));//输出加密后的字符串
    }
    }

  • 相关阅读:
    dada的GCD
    涛神的城堡
    手机信号
    涛涛的Party
    壮壮的数组
    不安全字符串
    gdb core 调试多线程
    makefile $@, $^, $<, $? 表示的意义
    KMP算法的next[]数组通俗解释
    【原创】支持同时生成多个main函数 makefile 模板
  • 原文地址:https://www.cnblogs.com/jxyZ/p/3197066.html
Copyright © 2011-2022 走看看