乘方取余-素数算法 ,为什么num超过int范围就会出错 ,int范围内就没问题,是a*a溢出导致的么

问题描述

素数算法 ,为什么num超过int范围就会出错 ,int范围内就没问题,是a*a溢出导致的么

#include
#include
using namespace std;
typedef unsigned long long ULL;
inline bool isPrime(ULL);
inline ULL powMod(ULL a, ULL n, ULL k);
int main()
{
clock_t begin, end;
begin = clock();
ULL num=0;
for (size_t i = 0;i != 500;++i)//素数验证
{
--num;
if (isPrime(num))
cout << num << "是素数" << endl;
}
end = clock();

cout << "运行时间为:" << (double(end - begin) / CLOCKS_PER_SEC) * 1000.0 << "毫秒" << endl;
while (1);
return 0;

}

inline bool isPrime(ULL num)
{
srand((unsigned)time(NULL));
for (size_t i = 0;i != 20;++i)
if (powMod(rand()%32768+1, num - 1, num) != 1)
return false;
return true;
}

inline ULL powMod(ULL a, ULL n, ULL k)//a^n%k
{
if (n == 0)return 1;
ULL ullResult = powMod((a*a) % k, n / 2, k);
if (n % 2)
ullResult = (ullResult*a) % k;
return ullResult;
}

解决方案

size_t不同平台不同,32位下它相当于unsigned int,所以溢出

解决方案二:

num超过int范围,a*a就会溢出,还有检查下是不是除了0

时间: 2024-09-20 09:05:53

乘方取余-素数算法 ,为什么num超过int范围就会出错 ,int范围内就没问题,是a*a溢出导致的么的相关文章

取余运算符 (%)

运算   一个表达式的值除以另一个表达式的值,返回余数. result = number1 % number2 参数 result 任何变量. number1 任何数值表达式. number2 任何数值表达式. 说明 取余(或余数)运算符用 number1 除以 number2 (把浮点数四舍五入为整数),然后只返回余数作为 result.例如,在下面的表达式中,A (即 result)等于 5. A = 19 % 6.7 要求 版本 1 请参阅 %= 运算符 | 运算符优先级 | 运算符总结

取余赋值运算符 (%=)

运算   变量值除以表达式值,并将余数赋给变量. result %= expression 参数 result 任何变量. expression 任何数值表达式. 说明 使用 %= 运算符与使用下面的语句是等效的: result = result % expression 要求 版本 1 请参阅 % 运算符 | 运算符优先级 | 运算符总结 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索变量 , 运算符 , 表达式 ,

PHP中余数、取余的妙用_php技巧

<?php $ary=array("name","egineer","sonny","tonny","pingk","apple","phone","clone","pink","colle"); foreach($ary as $key=>$value){ $key=$key+1; if($ke

c语言-C语言求素数算法,有几种方法可以降低时间复杂度

问题描述 C语言求素数算法,有几种方法可以降低时间复杂度 b可以非常大的时候,输出a到b之间素数的个数,怎么才能简化算法,降低运行时间 解决方案 采用列表法,每次找到新的素数,添加到表中.每次寻找素数,不用每个数字都尝试一次,而只要尝试小于这个数字的1/2的所有素数就可以了. 解决方案二: 具体做法 http://blog.csdn.net/liukehua123/article/details/5482854 解决方案三: 不需要b的1/2,只需要判断到b的根号2 解决方案四: http://

文档-i.src=arr[++idx%3]为什么取余是三?(三张图片自动换就要%3?)那两张换呢

问题描述 i.src=arr[++idx%3]为什么取余是三?(三张图片自动换就要%3?)那两张换呢 无标题文档 var i=document.getElementById("i") var arr=["../../img/1.jpg","../../img/2.jpg","../../img/3.jpg"] var idx=0 function changeImage(){ i.src=arr[++idx%3] } var

ASP(VBScript)中整除和取余_应用技巧

整除 ASP(VBScript) 中整除用"\",比如 m = 5 \ 2,结果为 2. 取余 ASP(VBScript) 中取余用 mod,比如 m = 5 mod 2,结果为 1. 大数注意 m = 4444444444 / 2 n = 4444444444 \ 2 第一句是正确的,第二句运行时会报溢出错误,因为:在整除.取余操作前,数值表达式四舍五入为 Byte.Integer 或 Long 子类型表达式.Long 子类型的范围是 [-2147483648, 2147483647

PHP整数取余返回负数的相关解决方法_php技巧

PHP语言虽然功能强大,但并不代表其没有缺点,在编写代码的过程中未免会遇到一些让人头痛的问题.下面我们将为大家介绍有关PHP整数取余返回负数的解决办法. 我们先来看个例子. 复制代码 代码如下: $res = 16244799483; echo $res%9999999; // 输出结果为 -5069794, 正确的结果应该是4801107 其实这也算上PHP一个BUG吧.最主要是PHP是个弱类型语言.他内置了机器来判断用户的类型. 但是机器毕竟是机器.也有判断出错的时候.就像上面.所以这时候我

php-新手问题(PHP单,双引号区别 以及 取余%怎么运算)

问题描述 新手问题(PHP单,双引号区别 以及 取余%怎么运算) 在PHP中,单引号和双引号有什么区别? 取余运算符怎么运算?例如7.5%3为什么结果是1; 7.5%3.5为什么结果也是1 解决方案 剩余的1.5取整了,舍弃小数,保留整数,余数没有小数 解决方案二: 剩余的1.5取整了,舍弃小数,保留整数,余数没有小数

ASP(VBScript)中整除和取余

整除 ASP(VBScript) 中整除用"\",比如 m = 5 \ 2,结果为 2. 取余 ASP(VBScript) 中取余用 mod,比如 m = 5 mod 2,结果为 1. 大数注意 m = 4444444444 / 2 n = 4444444444 \ 2 第一句是正确的,第二句运行时会报溢出错误,因为:在整除.取余操作前,数值表达式四舍五入为 Byte.Integer 或 Long 子类型表达式.Long 子类型的范围是 [-2147483648, 2147483647