基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注
给出1个正整数N,检测N是否为质数。如果是,输出"Yes",否则输出"No"。

Input
  1. 输入一个数N(2 <= N <= 10^30)
Output
  1. 如果N为质数,输出"Yes",否则输出"No"
Input示例
  1. 17
Output示例
  1. Yes

大数的素数测试,套上模板

  1. #include<iostream>
  2. using namespace std;
  3. //#include<stdlib>
  4. #include<string>
  5. #include<string.h>
  6. #include<algorithm>
  7. #define MAXL 4
  8. #define M10 1000000000
  9. #define Z10 9
  10. const int zero[MAXL - 1] = {0};
  11. struct bnum
  12. {
  13. int data[MAXL]; // 断成每截9个长度
  14. // 读取字符串并转存
  15. void read()
  16. {
  17. memset(data, 0, sizeof(data));
  18. char buf[32];
  19. scanf("%s", buf);
  20. int len = (int)strlen(buf);
  21. int i = 0, k;
  22. while (len >= Z10)
  23. {
  24. for (k = len - Z10; k < len; ++k)
  25. {
  26. data[i] = data[i] * 10 + buf[k] - '0';
  27. }
  28. ++i;
  29. len -= Z10;
  30. }
  31. if (len > 0)
  32. {
  33. for (k = 0; k < len; ++k)
  34. {
  35. data[i] = data[i] * 10 + buf[k] - '0';
  36. }
  37. }
  38. }
  39. bool operator == (const bnum &x)
  40. {
  41. return memcmp(data, x.data, sizeof(data)) == 0;
  42. }
  43. bnum & operator = (const int x)
  44. {
  45. memset(data, 0, sizeof(data));
  46. data[0] = x;
  47. return *this;
  48. }
  49. bnum operator + (const bnum &x)
  50. {
  51. int i, carry = 0;
  52. bnum ans;
  53. for (i = 0; i < MAXL; ++i)
  54. {
  55. ans.data[i] = data[i] + x.data[i] + carry;
  56. carry = ans.data[i] / M10;
  57. ans.data[i] %= M10;
  58. }
  59. return ans;
  60. }
  61. bnum operator - (const bnum &x)
  62. {
  63. int i, carry = 0;
  64. bnum ans;
  65. for (i = 0; i < MAXL; ++i)
  66. {
  67. ans.data[i] = data[i] - x.data[i] - carry;
  68. if (ans.data[i] < 0)
  69. {
  70. ans.data[i] += M10;
  71. carry = 1;
  72. }
  73. else
  74. {
  75. carry = 0;
  76. }
  77. }
  78. return ans;
  79. }
  80. // assume *this < x * 2
  81. bnum operator % (const bnum &x)
  82. {
  83. int i;
  84. for (i = MAXL - 1; i >= 0; --i)
  85. {
  86. if (data[i] < x.data[i])
  87. {
  88. return *this;
  89. }
  90. else if (data[i] > x.data[i])
  91. {
  92. break;
  93. }
  94. }
  95. return ((*this) - x);
  96. }
  97. bnum & div2()
  98. {
  99. int i, carry = 0, tmp;
  100. for (i = MAXL - 1; i >= 0; --i)
  101. {
  102. tmp = data[i] & 1;
  103. data[i] = (data[i] + carry) >> 1;
  104. carry = tmp * M10;
  105. }
  106. return *this;
  107. }
  108. bool is_odd()
  109. {
  110. return (data[0] & 1) == 1;
  111. }
  112. bool is_zero()
  113. {
  114. for (int i = 0; i < MAXL; ++i)
  115. {
  116. if (data[i])
  117. {
  118. return false;
  119. }
  120. }
  121. return true;
  122. }
  123. };
  124. void mulmod(bnum &a0, bnum &b0, bnum &p, bnum &ans)
  125. {
  126. bnum tmp = a0, b = b0;
  127. ans = 0;
  128. while (!b.is_zero())
  129. {
  130. if (b.is_odd())
  131. {
  132. ans = (ans + tmp) % p;
  133. }
  134. tmp = (tmp + tmp) % p;
  135. b.div2();
  136. }
  137. }
  138. void powmod(bnum &a0, bnum &b0, bnum &p, bnum &ans)
  139. {
  140. bnum tmp = a0, b = b0;
  141. ans = 1;
  142. while (!b.is_zero())
  143. {
  144. if (b.is_odd())
  145. {
  146. mulmod(ans, tmp, p, ans);
  147. }
  148. mulmod(tmp, tmp, p, tmp);
  149. b.div2();
  150. }
  151. }
  152. bool MillerRabinTest(bnum &p, int iter)
  153. {
  154. int i, small = 0, j, d = 0;
  155. for (i = 1; i < MAXL; ++i)
  156. {
  157. if (p.data[i])
  158. {
  159. break;
  160. }
  161. }
  162. if (i == MAXL)
  163. {
  164. // small integer test
  165. if (p.data[0] < 2)
  166. {
  167. return false;
  168. }
  169. if (p.data[0] == 2)
  170. {
  171. return true;
  172. }
  173. small = 1;
  174. }
  175. if (!p.is_odd())
  176. {
  177. return false; // even number
  178. }
  179. bnum a, s, m, one, pd1;
  180. one = 1;
  181. s = pd1 = p - one;
  182. while (!s.is_odd())
  183. {
  184. s.div2();
  185. ++d;
  186. }
  187. for (i = 0; i < iter; ++i)
  188. {
  189. a = rand();
  190. if (small)
  191. {
  192. a.data[0] = a.data[0] % (p.data[0] - 1) + 1;
  193. }
  194. else
  195. {
  196. a.data[1] = a.data[0] / M10;
  197. a.data[0] %= M10;
  198. }
  199. if (a == one)
  200. {
  201. continue;
  202. }
  203. powmod(a, s, p, m);
  204. for (j = 0; j < d && !(m == one) && !(m == pd1); ++j)
  205. {
  206. mulmod(m, m, p, m);
  207. }
  208. if (!(m == pd1) && j > 0)
  209. {
  210. return false;
  211. }
  212. }
  213. return true;
  214. }
  215. int main()
  216. {
  217. bnum x;
  218. x.read();
  219. puts(MillerRabinTest(x, 5) ? "Yes" : "No");
  220. return 0;
  221. }

51nod 1186 质数检测 V2的更多相关文章

  1. 51nod 1106 质数检测——Mr判素数

    质数检测一般都是根号n的写法 当然Mr判素数的方法可以实现log的复杂度2333 Mr判素数的话 我们根据费马小定理只要P是素数 那么另一个素数x 满足 x^P-1≡1(mod P) 同时 x^2%P ...

  2. (数论 欧拉筛法)51NOD 1106 质数检测

    给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No".   Input 第1行:一个数N,表示正整数的数量.(1 <= N &l ...

  3. F - 质数检测 V2

    https://vjudge.net/contest/218366 Java解 import java.math.BigInteger; import java.util.Scanner; publi ...

  4. 51nod 1106 质数检测

    #include <bits/stdc++.h> using namespace std; int n; ; bool s[maxn]; void is_prime() { memset( ...

  5. 51nod 1181 质数中的质数(质数筛法)

    题目链接:51nod 1181 质数中的质数(质数筛法) #include<cstdio> #include<cmath> #include<cstring> #i ...

  6. 51Nod 1016 水仙花数 V2(组合数学,枚举打表法)

    1016 水仙花数 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 160         难度:6级算法题                水仙花数是指一个 n 位数 ( n≥3 ) ...

  7. 51nod 1022 石子归并 V2 —— DP四边形不等式优化

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2  基准时间限制:1 秒 空间限 ...

  8. 51Nod:1086背包问题 V2

    1086 背包问题 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里 ...

  9. 51nod 1181 质数中的质数

    1181 质数中的质数(质数筛法) 题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 如果一个质数,在质数列表中的编号也是质数,那么就称 ...

随机推荐

  1. Go --- 设计模式(工厂模式)

    简易工厂主要是用来解决对象“创建”的问题.以下的例子取自<大话设计模式>中第一章,实现一个可扩展的“计算器”.当增加新的功能时,并不需改动原来已经实现的算法.由于是简易工厂,所以我们还是需 ...

  2. jquery 动态添加,降低input表单的方法

    html代码例如以下 <html> <tr><button style="margin-left:10px" class="add_fiel ...

  3. 微信小程序 常见问题 小结

    1.微信小程序 尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...

  4. HBase单机环境搭建

    在搭建HBase单机环境之前,首先你要保证你已经搭建好Java环境: $ java -version java version "1.8.0_51" Java(TM) SE Run ...

  5. 【Mongodb教程 第一课补加课2 】MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法

    如图,如果通过下列代码,添加服务后,使用net start命令出现这样的问题时,可以参考下我的解决方法. D:\MongoDB>mongod --dbpath D:\MongoDB\Data - ...

  6. 《modern operating system》 chapter 6 DEADLOCKS 笔记

    DEADLOCKS Both processes are blocked and will remain so forever. This situation is called a deadlock ...

  7. DBscan算法及其Python实现

    DBSCAN简介: 1.简介 DBSCAN 算法是一种基于密度的空间聚类算法.该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值.DBS ...

  8. 如何写好react组件

    react 组件方面: 总结 React 组件的三种写法 及最佳实践 [涨经验] React组件编写思路(一) 使用react-router实现单页面应用时设置页面间过渡的两种方式 [翻译]基于 Cr ...

  9. 创建GitHub技术博客全攻略【转】

    本文转载自:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比 ...

  10. vim插件:显示树形目录插件NERDTree安装 和 使用【转】

    本文转载自:https://my.oschina.net/VASKS/blog/388907 下载和配置 NERDTree插件的官方地址如下,可以从这里获取最新的版本 https://github.c ...