wesson2019

最大公约数

  1. /// <summary>
  2. /// 找到并返回最大公约数
  3. /// </summary>
  4. /// <param name="a"></param>
  5. /// <param name="b"></param>
  6. /// <returns></returns>
  7. public static int FindGCD(int a, int b)
  8. {
  9. if (a==0)
  10. {
  11. return b;
  12. }
  13. if (b==0)
  14. {
  15. return a;
  16. }
  17. int _a = a, _b = b;
  18. int r = _a & _b;
  19. while (r!=0)
  20. {
  21. _a = _b;
  22. _b = r;
  23. r = _a & _b;
  24. }
  25. return _b;
  26. }

相对质数

  1. /// <summary>
  2. /// 确定给定的两个数是相对质数
  3. /// </summary>
  4. /// <param name="a"></param>
  5. /// <param name="b"></param>
  6. /// <returns></returns>
  7. public static bool IsRelativelyPrime(int a ,int b)
  8. {
  9. return FindGCD(a, b) == 1;
  10. }

二项式系数 C(n,k)

从n个选取k个的方法总数

  1. /// <summary>
  2. /// 二项式系数 C(n,k)
  3. /// </summary>
  4. /// <param name="n"></param>
  5. /// <param name="k"></param>
  6. /// <returns></returns>
  7. public static ulong BinomialCoefficients(uint n, uint k)
  8. {
  9. ulong rslt = 1;
  10. if (k > n-k)
  11. {
  12. k = n - k;
  13. }
  14. for (int i = 0; i < k; i++)
  15. {
  16. rslt *= Convert.ToUInt64(n - i);
  17. rslt /= Convert.ToUInt64(i + 1);
  18. }
  19. return rslt;
  20. }

逆平方根

  1. /// <summary>
  2. /// 逆平方根(浮点数的平方根倒数)
  3. /// </summary>
  4. /// <param name="number"></param>
  5. /// <returns></returns>
  6. public static float Q_rsqrt(float x)
  7. {
  8. float xhalf = 0.5f * x;
  9. unsafe
  10. {
  11. int i = *(int*)&x; // 浮点值当整数读取
  12. i = 0x5f3759df - (i >> 1); // 给初始猜测
  13. x = *(float*)&i; // 整数当浮点数读取
  14. x = x * (1.5f - xhalf * x * x);
  15. x = x * (1.5f - xhalf * x * x); // 第二次迭代,可删除
  16. }
  17. return x;
  18. }
  19. public static float Q_rsqrt2(float x)
  20. {
  21. float xhalf = 0.5f * x;
  22. int i = Convert.ToInt32(FloatToBinary(x).Replace(" ", string.Empty), 2);
  23. i = 0x5f3759df - (i >> 1); // 给初始猜测
  24. x = BinaryToFloat(Convert.ToString(i, 2));
  25. x = x * (1.5f - xhalf * x * x);
  26. x = x * (1.5f - xhalf * x * x); // 第二次迭代,可删除
  27. return x;
  28. }

约瑟夫环

  1. /// <summary>
  2. /// 约瑟夫环问题:有n个人围成一个圈,每隔q个人踢掉一个人,问最后留下来的人是几号
  3. /// O(logN)
  4. /// </summary>
  5. /// <param name="n"></param>
  6. /// <param name="q"></param>
  7. private static long JosephRing(long n, long q)
  8. {
  9. long D = 1, end = (q - 1) * n;
  10. while (D <= end)
  11. {
  12. D = Ceil(q * D, q - 1);
  13. }
  14. return q * n + 1 - D;
  15. }
  16. private static long Ceil(long x, long y)
  17. {
  18. return x / y + (x % y == 0 ? 0 : 1);
  19. }

最大公共子字符串

  1. /// <summary>
  2. /// 最大公共子字符串
  3. /// </summary>
  4. /// <param name="str1">字符串1</param>
  5. /// <param name="str2">字符串2</param>
  6. /// <returns>子串</returns>
  7. static string GetMaxCommonStr(string str1, string str2)
  8. {
  9. if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2))
  10. {
  11. return string.Empty;
  12. }
  13. var temp = new int[str1.Length, str2.Length];
  14. int max = -0; // 相同子串的最大长度
  15. int n1End = -1; // str1的长公共字符串的最后位置
  16. int n2End = -1; // str2的长公共字符串的最后位置
  17. for (int i = 0; i < str1.Length; i++)
  18. {
  19. for (int j = 0; j < str2.Length; j++)
  20. {
  21. if (str1[i] != str2[j])
  22. {
  23. temp[i, j] = 0;
  24. }
  25. else
  26. {
  27. if (i == 0 || j == 0)
  28. {
  29. temp[i, j] = 1;
  30. }
  31. else
  32. {
  33. temp[i, j] = temp[i - 1, j - 1] + 1;
  34. }
  35. if (temp[i,j] > max)
  36. {
  37. max = temp[i, j];
  38. n1End = i;
  39. n2End = j;
  40. }
  41. }
  42. }
  43. }
  44. var rslt = new StringBuilder();
  45. while (n1End >= 0 && n2End>= 0 && temp[n1End, n2End] > 0)
  46. {
  47. rslt.Insert(0, str1[n1End]);
  48. n1End--;
  49. n2End--;
  50. }
  51. return rslt.ToString();
  52. }