C# 判断给定大数是否为质数,目标以快速度得到正确的计算结果。

标题是一个测试题。在看到这道题的时候,第一反应这是一道考程序复杂度的题,其次再是算法问题。

我们先来看看质数的规则:

Link:http://en.wikipedia.org/wiki/Prime_number

C#求质数代码:

1         public bool primeNumber(int n){
2             int sqr = Convert.ToInt32(Math.Sqrt(n));
3             for (int i = sqr; i > 2; i--){
4                 if (n % i == 0){
5                     b = false;
6                 }
7             }
8             return b;
9         }


显然以上代码的程序复杂度为N

我们来优化下代码,再来看下面代码:

 1         public bool primeNumber(int n)
 2         {
 3             bool b = true;
 4             if (n == 2)
 5                 b = true;
 6             else
 7             {
 8                 int sqr = Convert.ToInt32(Math.Sqrt(n));
 9                 for (int i = sqr; i > 2; i--)
10                 {
11                     if (n % i == 0)
12                     {
13                         b = false;
14                     }
15                 }
16             }
17             return b;
18         }

通过增加初步判断使程序复杂度降为N/2。

以上两段代码判断大数是否质数的正确率是100%,但是对于题干

  1.满足大数判断;

  2.要求以最快速度得到正确结果;

显然是不满足的。上网查了下最快算法得到准确结果,公认的一个解决方案是Miller-Rabin算法

Link:http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

Miller-Rabin 基本原理是通过随机数算法判断的方式提高速度(即概率击中),但是牺牲的是准确率。

Miller-Rabin 对输入大数的质数判断的结果并不一定是完全准确的,但是对于本题来说算是一个基本的解题办法了。

Miller-Rabin C# 代码:

 1 public bool IsProbablePrime(BigInteger source) {
 2             int certainty = 2;
 3             if (source == 2 || source == 3)
 4                 return true;
 5             if (source < 2 || source % 2 == 0)
 6                 return false;
 7 
 8             BigInteger d = source - 1;
 9             int s = 0;
10 
11             while (d % 2 == 0) {
12                 d /= 2;
13                 s += 1;
14             }
15 
16             RandomNumberGenerator rng = RandomNumberGenerator.Create();
17             byte[] bytes = new byte[source.ToByteArray().LongLength];
18             BigInteger a;
19 
20             for (int i = 0; i < certainty; i++) {
21                 do {
22                     rng.GetBytes(bytes);
23                     a = new BigInteger(bytes);
24                 }
25                 while (a < 2 || a >= source - 2);
26 
27                 BigInteger x = BigInteger.ModPow(a, d, source);
28                 if (x == 1 || x == source - 1)
29                     continue;
30 
31                 for (int r = 1; r < s; r++) {
32                     x = BigInteger.ModPow(x, 2, source);
33                     if (x == 1)
34                         return false;
35                     if (x == source - 1)
36                         break;
37                 }
38 
39                 if (x != source - 1)
40                     return false;
41             }
42 
43             return true;
44         }


以上是我对本题的解题答案,欢迎大家讨论和提供更优办法。

代码戳:files.cnblogs.com/tmywu/PrimeNumberProject.zip

 

 

转载于:https://www.cnblogs.com/tmywu/archive/2013/05/15/3079403.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hook KiUserExceptionDispatcher参数指针错误的问题

跟了一个晚上,终于解决了 大概要实现的是用这个函数替换ntdll中的KiUserExceptionDispatcher,实现方法如下: VOID NTAPI KiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { DWORD retValue; if (RtlDispatchException(pExcptRec,pContext)) { retVa…

Docker image Introduce

Docker 的image是运行的基本.例如我们build一个image时, 在Dockerfile每条指令会产生一个可读写的image, 下一条指令使用上一条指令产生的image为基础, 继续产生image(然后删除上一个image), 如果指令没有对image有修改的动作, 那么可以使用image cache. 所有的指令执行完, 生成…

vue 筛选组件_记一个复杂组件(Filter)的从设计到开发

此文前端框架使用 rax&#xff0c;全篇代码暂未开源&#xff08;待开源&#xff09;原文链接地址&#xff1a;Nealyang/PersonalBlog前言貌似在面试中&#xff0c;你如果设计一个 react/vue 组件&#xff0c;貌似已经是司空见惯的问题了。本文不是理论片&#xff0c;更多的是自…

Adobe称Flash技术遭排斥 呼吁政府介入

据国外媒体昨日报道&#xff0c;Adobe在一份提交给美国证交会的申报文件中抱怨称&#xff0c;Flash技术遭到苹果的全面排斥&#xff0c;这有可能对Adobe的业务产生影响。一位业内人士指出&#xff0c;此举彰显出Adobe可能要求政府机构的介入。 呼吁政府介入苹果旗下iPod Touch、…

python的正则表达式 re

2019独角兽企业重金招聘Python工程师标准>>> 原文发表在&#xff1a; http://luy.li/2010/05/12/python-re/ 延伸阅读&#xff1a;python的 内建函数 和 subprocess 。此文是本系列的第三篇文章了&#xff0c;和之前一样&#xff0c;内容出自官方文档&#xff0c;但…

python爬取图书信息_Python3 爬虫爬取中国图书网(淘书团) 记录

本人为一名刚开始学Python爬虫的小白&#xff0c;开贴仅为记录下自己的学习历程&#xff0c;方便做review要爬取链接&#xff1a;http://tuan.bookschina.com/要爬取内容&#xff1a; 图书名称&#xff0c; 图书价格&#xff0c; 以及对应预览图的link本文用到py packages: req…

求1到100中9的个数

个位9的数目十位9的数目 #include<stdio.h> int main() {int num 0;int count 0;for (num 1; num < 100; num){if (num % 10 9) //个位9的个数count;if (num / 10 9)//十位9的个数count;}printf("%d", count);return 0; }

Android 核心已经从 Linux kernel 代码库中删除

Greg Kroah-Hartman Novell 的开发人员&#xff0c;他主要负责维护 Linux 操作系统的启动&#xff0c;USB和驱动核心&#xff0c;近日他表示谷歌 Android 系统的驱动核心 已经从 Linux kernel 2.6.33 代码库中删除。Greg Kroah-Hartman 也是一个 Android 手机系统的爱好者&…

福克斯保养明细

福克斯轮胎厚度&#xff1a; 胎冠厚度在13mm左右(胎冠花纹深7mm、胎冠厚6mm&#xff09;&#xff0c; 胎侧厚度5mm。 现在的轿车轮胎一般胎面胶层厚度都比较厚&#xff0c;以165/70R13 锦湖KR19轮胎为例:花纹深度为7毫米&#xff0c;缓冲层1&#xff0d;1.5毫米&#xff0c;冠带…

python中英文半角还是全角_Python3全角转半角的方法

相信大家都对全角半角的概念已经有所了解了。中文文字永远是全角&#xff0c;只有英文字母、数字键、符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角&#xff0c;占半个汉字的位置叫半角。标点符号在中英文状态下、全半角的状态下是不同的。转换说明全角半角转…

USACO 1.1 Your Ride Is Here

今天开始切USACO 加油 /* ID: aznfy1 PROG: ride LANG: C */ #include <iostream> #include <fstream> #include <string> #include <stdio.h>using namespace std;char a[10],b[10];int main() {freopen("ride.in","r",stdin);f…

C语言分数求和

eg.1-1/21/3-1/41/5-1/6…1/99-1/100 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>int main() {int i 0;double sum 0.0;int flag 1;for (i 1; i < 100; i){sum flag*1.0 / i;flag -flag;}printf("%lf\n", sum);return 0; }

Mysql支持的数据类型(总结)

2019独角兽企业重金招聘Python工程师标准>>> 一.数值类型 Mysql支持所有标准SQL中的数值类型&#xff0c;其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC)&#xff0c;以及近似数值数据类型(FLOAT,REAL,DOUBLE PRESISION),并在此基础上进行扩展。 扩展后增…

chrome web store的信息

chrome web store终于现身了&#xff0c;期待好久了啊&#xff01;以后好玩了&#xff0c;哈哈。迅速记录一下几个链接&#xff1a;https://chrome.google.com/webstorehttp://groups.google.com/a/chromium.org/group/chromium-apps/topicshttp://code.google.com/intl/zh-CN/…

uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

理解&#xff1a;let变量的作用域只能在当前函数中js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net全局作用域中&#xff0c;用 const 和 let 声明的变量不在 window 上&#xff0c;那到底在哪里&#xff1f;如何去获取&#xff1f;​blog.csdn.n…

C语言求十个数中最大值

一.代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,63,7,8,9,11 };int sz sizeof(arr) / sizeof(arr[0]);int max arr[0];int i 0;for (i 1; i < 10; i){if (arr[i] > max)max arr[i];}printf("%d\n&qu…

ubuntu20.04安装timeshift最新方法

总结&#xff1a; 现在可以使用如下代码安装 sudo apt-get update sudo apt-get install timeshift原因&#xff1a; 在尝试Timeshift系统备份与还原中的方法时&#xff0c; sudo apt-add-repository -y ppa:teejee2008/ppa运行失败。 更改为以下代码&#xff1a; sudo a…

js基础练习---面向对象浅理解分析

function createPerson(name,sex,color) //构造函数{var objnew Object();//创建一个空对象obj.namename; obj.sexsex;obj.colorcolor;obj.Shownamefunction(){alert("我的名字是"this.name);};obj.Showsexfunction(){alert("我是"this.sex"的")…

前端一些面试问题3

DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。 DOM操作——怎样添加、移除、移动、复制、创建和查找节点。 1.创建新节点 createDocumentFragment() createElement() createTextNode() 2.添加、移除、替换 appendChild() removeChild() replaceChild(…

SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

在保密你的服务器和数据&#xff0c;防备当前复杂的攻击&#xff0c;SQL Server有你需要的一切。但在你能有效使用这些安全功能前&#xff0c;你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础&#xff0c;因此你可以对SQL Server里的安全功能充分利用&#xf…