所以我正在尝试创建一个函数,该函数将返回1或0,具体取决于给定的数字是否为素数。
注意:我肯定知道给定的数字是自然的。大于1
我原来的功能:
int Prime(int a) {
int i;
for (i = 2; i*i <= a; i++)
{
if ((a % i) == 0)
return 0;
};
return 1;
}
工作正常,但不知怎的......慢。我正在寻找一种更有效的算法而不使用数组。我的第二次尝试:
int Prime(int a) {
int i;
if (a == 2)
return 1;
if ((a % 2) == 0)
return 0;
for (i = 3; i*i <= a; i = i + 3)
{
if ((a % i) == 0)
return 0;
};
return 1;
}
结局很糟糕。有一些数字(我无法想象),小于MAX_INT
,导致这个特定的算法工作得非常慢。所以,我有两个问题:
我的升级算法有问题吗?
有没有办法更有效地完成这项任务?
答案 0 :(得分:1)
1)我的升级算法出了什么问题?
是
i=i+3
需要为i=i+2
,否则您需要检查3(3,6,9,12,...)的倍数而不是奇数(3,5,7,9) ,...)
2)有没有办法更有效地完成这项任务?
您可以计算sqrt(a)
并将其分配给变量(例如sqrtOfA
),并在循环条件中检查i <= sqrtOfA
。
或者您可以像prime number sieve一样尝试sieve of Eratosthenes。
答案 1 :(得分:0)
这取决于你是想知道数字是素数还是只有高概率素数。 如果你对程序可能给出错误的答案感到满意,或者流星崩溃,那么流星崩溃的可能性更大,那么你就可以使用像Miller-Rabin测试这样的O(1)检查。
http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test
还有一个确定性的O(n ^ 12)算法用于素性测试,但在实践中并没有太多用。
答案 2 :(得分:0)
@Dukeling绝对正确。另外,我想添加一个小条件来检查&#34;是1个素数?&#34;
因为在标准程序中,我们在循环本身的帮助下得到1作为非素数。但在这里,我们必须为此手动添加条件。
所以只需添加以下内容&#39; if&#39;条件和你的代码完美运行!
$('.updatebutton').on('click', function(event) {
var elements = $('.quantity input[name="quantity"]'),
url = 'includes/cartoverzicht.php',
postBody = [];
for (var i=0; i<elements.length; i++) {
var element = $(elements[i]);
postBody.push({
edit: element.attr('id'),
aantal: element.val()
})
}
var posting = $.post( url, JSON.stringify(postBody) );
posting.done(function( data ) {
var content = $( data );
$( "#cartresult" ).empty().append( content );
});
});