楔子数(Sphenic Number)来自于一个题目:

Schoolboy Vasya is interested in the problem of distinguishing prime numbers. He has decided to develop his own testing method for it. Unfortunately, the new algorithm has one deficiency – it yields false positive outputs in case with so-called sphenic numbers. For those who does not know: sphenic number is the product of exactly three distinct prime numbers. Help Vasya write a program to distinguish sphenic numbers.

译文:

小学生瓦西亚对区分素数的问题很感兴趣。他决定开发自己的测试方法。不幸的是,新算法有一个缺陷——在使用所谓的sphenic数的情况下,它会产生假阳性输出。对于那些不知道的人来说:Sphenic Number是三个不同素数的乘积。帮助Vasya编写一个程序来计算(分解)sphenic number。

Define:

        Sphenic Number = Prime1 * Prime2 * Prime3

Where:

        Prime1 != Prime2

        Prime2 != Prime3

一、运算效果

二、暴力求解算法源代码

/// <summary>
/// 最大质数
/// </summary>
private static int primeMax { get; set; } = 10467397 / 6;
/// <summary>
/// 质数总数
/// </summary>
private static int primeCount { get; set; } = 0;
/// <summary>
/// 质数筛(数组)
/// </summary>
private static int[] primeArray { get; set; } = new int[primeMax + 10];/// <summary>
/// 构造质数(筛)
/// </summary>
public static void SieveInitialize()
{primeCount = 0;int[] visitArray = new int[primeMax + 10];for (int i = 2; i < primeMax; i++){if (visitArray[i] == 0){primeArray[primeCount++] = i;for (int j = 1; j * i <= primeMax; j++){visitArray[j * i] = 1;}}}
}/// <summary>
/// 暴力求解 x 是不是 楔子数
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public static bool IsSphenicOriginal(int x)
{int i = 0;int count = 0;for (i = 0; i < primeCount && x > 1; i++){if ((x % primeArray[i]) == 0){count++;x /= primeArray[i];}if ((x % primeArray[i]) == 0){break;}}if (count == 3 && x == 1) // && !(i < cur && n > 1){return true;}return false;
}

三、高效算法

/// <summary>
/// 哈希表
/// </summary>
private Hashtable sphenicHash { get; set; } = new Hashtable();
/// <summary>
/// 保存全部楔子数的列表
/// </summary>
private List<int> sphenicNumbers { get; set; } = new List<int>();
/// <summary>
/// 表达式
/// </summary>
private List<string> sphenicExpressions { get; set; } = new List<string>();/// <summary>
/// 构造函数
/// </summary>
/// <param name="max"></param>
public SphenicNumber(int max = 100)
{List<int> ps = PrimeList(max);for (int i = 0; i < ps.Count - 2; i++){for (int j = i + 1; j < ps.Count - 1; j++){for (int k = j + 1; k < ps.Count; k++){int v = ps[i] * ps[j] * ps[k];sphenicNumbers.Add(v);sphenicExpressions.Add(ps[i] + "*" + ps[j] + "*" + ps[k]);if (!sphenicHash.ContainsKey(v)){sphenicHash.Add(v, sphenicHash.Count);}}}}
}/// <summary>
/// 总数
/// </summary>
public int Count
{get{return sphenicNumbers.Count;}
}/// <summary>
/// 提取第 index 个楔子数
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public int this[int index]
{get{return sphenicNumbers[index];}
}/// <summary>
/// 提取全部楔子数
/// </summary>
/// <returns></returns>
public List<int> ToList()
{return (sphenicNumbers);
}/// <summary>
/// 提取全部表达式列表
/// </summary>
/// <returns></returns>
public List<string> ToExpressionList()
{return (sphenicExpressions);
}/// <summary>
/// 构造不超过 x 的全部质数列表
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private List<int> PrimeList(int x = 100)
{List<int> list = new List<int>();list.Add(2);list.Add(3);for (int j = 4; j <= x; j++){bool isprime = true;for (int i = 2; (i * i) <= j; i++){if ((j % i) == 0){isprime = false;break;}}if (isprime){list.Add(j);}}return list;
}/// <summary>
/// 检验 x 是不是楔子数?
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public bool IsSphenic(int x)
{return sphenicHash.ContainsKey(x);
}/// <summary>
/// 返回计算公式
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public string SphenicExpression(int x)
{if (sphenicHash.ContainsKey(x)){return sphenicExpressions[(int)sphenicHash[x]];}return "";
}

C#,楔子数(Sphenic Number)的暴力算法与高效算法源代码相关推荐

  1. python终极版实现B*寻路算法,高效算法,B*寻路算法,思维优化(4完结)

    总结一下流程: 思维:直接走向终点+穿透障碍 1,从起点 直接向终点做,每次获取一下指向终点的向量,加一下自身坐标,得到下一个坐标. 分支:1.不是障碍,就继续往前走. 2.是障碍,获取四个关键点(障 ...

  2. C语言强数Strong number算法(附完整源码)

    强数Strong number算法 何为Strong number强数 C语言强数Strong number算法完整源码(定义,实现,main函数测试) 何为Strong number强数 强数是一个 ...

  3. C语言实现阿姆斯特朗数armstrong number算法(附完整源码)

    阿姆斯特朗数armstrong number 实现阿姆斯特朗数armstrong number算法的完整源码(定义,实现,main函数测试) 实现阿姆斯特朗数armstrong number算法的完整 ...

  4. 暴力子字符串查找算法

    暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高.是一种简单.粗暴的查找方式. 在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较. 核心思想:就是对主 ...

  5. python 查询周数 week number

    python里面查询某一天所处的周数week number时,有比较多的方法, 自己觉得下面这个方法特别棒,在一些方面的处理非常合理. 每年的最后一天必然是12月31日,是12月的最后一天,但这天不一 ...

  6. 卡特兰数 Catalan number

    卡特兰数 Catalan number 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

  7. 细数20世纪最伟大的10大算法

    发明十大算法的其中几位算法大师 一.1946 蒙特卡洛方法 [1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Lo ...

  8. 将十进制数转换成二进制、八进制、十六进制数算法

    将十进制数转换成二进制.八进制.十六进制算法 递归算法: //将数字a转成b进制数 public static void anInt(int a, int b) {if (a / b != 0) {a ...

  9. 字符串匹配算法之暴力做法(朴素算法)

    字符串匹配算法之暴力做法(朴素算法) 1.字符串匹配算法 1.1 简介 1.2 类型 1.3 示例题目 2.暴力做法(朴素算法) 2.1 暴力算法的思路 2.2 暴力算法的特点: 2.3 暴力算法的J ...

最新文章

  1. 基于大数据的用户行为预测
  2. 10g TNS 13541 监听错误 tnsping可以但是conn system/manager@mult1.net 报错
  3. Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)
  4. 2020-09-17
  5. 在Eclipse中如何让struts.xml显示提示
  6. VS2019 禁止Web项目停止调试后自动关闭浏览器(在浏览器窗口关闭时停止调试程序,在调试停止时关闭浏览器)
  7. visudo精确用户赋权(sudo)
  8. db2与mysql编目_DB2编目、联邦数据库 - Goopand's OS Space - OSCHINA - 中文开源技术交流社区...
  9. 飞鸽传书的设计应当具有“完整性”
  10. 解决LInux更新慢的问题, 更换国内软件源
  11. c# textbox和listbox多行显示
  12. 计算机cad制图软件有哪些,cad制图软件有哪些?
  13. wifi共享大师开启失败发射功能失败
  14. Linux命令行下使用飞信
  15. 【阿里云IoT+YF3300】9.快速开发modbus设备驱动
  16. [Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]
  17. Android点击文字编辑进行缩放、移动和改变字体、颜色的实现
  18. 什么是ADO.NET
  19. ORA-01840: 输入值对于日期格式不够长
  20. 微信小程序点击复制文本至剪切板

热门文章

  1. CSDN日报20170304——《令人比较失落的IT圈子-关于华为裁员》
  2. RK3568平台开发系列讲解(NPU篇)让 NPU 跑起来
  3. FPS游戏自瞄爆头原理
  4. 圣墟(圣墟最新章节,圣墟无弹窗全文阅读,圣墟无广告全文阅读)
  5. C#超市进销存系统管理源码(CS架构)
  6. TDengine与InfluxDB对比测试
  7. 基于GIO/FVID的DSP视频驱动程序
  8. 2022-10-10(通达OA SQL注入漏洞)
  9. 论文阅读-基于遗传算法的NAS
  10. UGUI IPointerUpHandler事件失灵