我试图创建一个检查数字是否为素数的函数。但是我希望这个功能能够回应用户“素数”。或者' NOT prime' - 那就是我的问题开始的地方。 让我告诉你我的代码:
class IsPrime
{
function check($num)
{
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
break;
}
}
echo 'Prime';
}
}
$x = new IsPrime();
$x->check(4);
问题在于,当我输入任何素数时 - 它可以正常工作,但是当我输入任何非素数时 - 它也会回显第二个回声,就像这样:'NOT prime prime'
。
我怎样才能让它回应正确答案?
答案 0 :(得分:7)
in 54 59字节:
function is_prime($n){for($i=$n;--$i&&$n%$i;);return$i==1;}
从$i
向下循环$n-1
,直到找到$n
的除数;如果除数为1,则$n
为素数。
添加10个字节以获得更好的性能:
function is_prime($n){for($i=$n**.5|1;$i&&$n%$i--;);return!$i&&$n>1;}
从(约)$i
到sqrt($n)
循环1
,寻找带有$ i后减量的除数。
如果除数为1
,则$i
最后为0
,!$i
给出true
。
此solition使用了一个技巧:对于$n=2
或3
,$i
将在第一次迭代中初始化为1→循环退出。对于较大的偶数平方根($n**.5|0
),|1
用作+1
。对于奇数平方根,不需要+1
,因为:如果$n
可被root+1
整除,则它也可被2
整除。不幸的是,这可能会耗费大量的迭代次数;所以你最好
添加另外7个字节以获得更好的性能:
function is_prime($n){for($i=~-$n**.5|0;$i&&$n%$i--;);return!$i&$n>2|$n==2;}
$n=2
需要一个特殊情况:初始$i=2
除$n=2
→最后$i=1
→返回false
。
将1
添加到$n
而不是平方根就足以避免失败;但是:
我没有计算迭代次数,只测试了时间消耗;并且仅在TiO中而不是在受控环境中。最后两个版本之间的差异小于几次运行之间的偏差。 稍后可能会添加重要的测试结果。
答案 1 :(得分:4)
您可以检查数字是否为素数,并且不使用此功能使用循环:
var opts = {
filter: "(&(objectClass=user))",
scope: "sub",
client: "*",
attributes: ['distinguishedName']
};
答案 2 :(得分:1)
正如许多答案指出的那样,你的逻辑代码存在一个问题:当你得到i
num % i == 0
时,你打印“NOT prime”并退出循环,之后,你仍然打印“主要”。有些人在echo "Prime"
移动if-else
,但仍然是错误的。一种方法,例如,
class IsPrime
{
function check($num)
{
$bCheck = True;
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
$bCheck = False;
break;
}
}
if $bCheck
echo 'Prime';
else
echo 'NOT prime';
}
}
$x = new IsPrime();
$x->check(4);
答案 3 :(得分:1)
您可以找到从1到极限及其数量的素数和非素数。
public function prime_checker($count){
$counter=0;
$no_prime=0;
for($i=2 ; $i<=$count; $i++ ){
for($j=2 ; $j<$i ; $j++ ){
if($i % $j == 0){
echo $i.'is not prime<br/>';
$no_prime=$i;
break;
}
}
if($i != $no_prime){
$prime_numbers[$counter]=$i;
$counter=$counter+1;
}
}
echo '<br/>'.$counter.'prime numbers<br/><br/>';
for($i=0 ; $i<$counter ; $i++ ){
echo $prime_numbers[$i].' is prime<br/>';
}
}
答案 4 :(得分:1)
如果数字真的是素数,这可能是一个很长的过程。还有一个较短的程序。 我们不需要将for循环运行到数字本身。相反,我们可以将它运行到最高整数小于或等于数字的平方根。
class IsPrime
{
function check($num)
{
$bCheck = True;
$highestIntegralSquareRoot = floor(sqrt($num));
for ($i = 2; $i <= $highestIntegralSquareRoot; $i++)
{
if ($num % $i == 0)
{
$bCheck = False;
break;
}
}
if $bCheck
echo 'Prime';
else
echo 'NOT prime';
}
}
$x = new IsPrime();
$x->check(97);
现在,在上面,如果我们检查97是否为素数(实际上是),那么循环不需要从2运行到97,而只需要运行2到9.(97的平方根是9.8488578018,小于或等于9的最大整数。同样,我们可以检查数字121(这不是素数,因为它可以被11整除)。限制将从2增加到11等等。等等。 实际上,我们需要通过附近较小的素数来检查数字的可分性,但这会更复杂。 希望这会有所帮助。
答案 5 :(得分:0)
整个程序正确。但只有您应该使用 exit 函数替换 break ,因为break仅用于退出用花括号{}括起来的循环,而exit用于停止执行整个脚本。
class IsPrime
{
function check($num)
{
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
break;
}
}
echo 'Prime';
}
}
$x = new IsPrime();
$x->check(4);
答案 6 :(得分:0)
休息只会打破for循环,
请改用return;
。它将退出函数
答案 7 :(得分:0)
首先,请不要在这里犯错误:
df['new builds'].astype(str).astype(int)
然后:
number_of_columns = len(data.columns)
number_of_rows = data.shape[0]
for i in range(0, len(keyword_list)):
column_loop = i + 1
type(column_loop)
for x in range(number_of_rows):
row_loop = x + 1
type(row_loop)
sheet.update_cell(column_loop, row_loop, data.loc[x,keyword_list[i]])
2%2等于0,然后2表示为非素数。
接下来,您不必检查偶数,因此在检查$ num == 2之后,性能会更好:
for ($i = 2; $i < $num; $i++)
注意$ num / 2-您不必进行检查。 甚至更好的是:
if ($num % $i == 0) return false;
这是因为当您用2和3进行除法运算时,所有其他NON素数都是两个(或更多)素数的乘积(例如49 = 7 * 7或55 = 5 * 11)。在最坏的情况下,您的$ i指针将达到$ num的平方根(例如49 = 7 * 7)。这就是为什么要检查直到$ i * $ i <= $ num。
答案 8 :(得分:0)
我做了一个类似的例子,用户输入数字,然后PHP检查数字是否为质数。
HTML
<p>See if your number is a prime number</p>
<form>
<input type='number' name='number'>
<input type='submit' value='Check!'>
</form>
PHP
if ($_GET) {
$i = 2;
$isPrime = true;
while ($i < $_GET['number']) {
if ($_GET['number'] % $i == 0){
// Number is NOT prime
$isPrime = false;
}
$i++;
}
if ($isPrime){
echo '<p>'.$i.' is a prime number!';
} else {
echo '<p>'.$i.' is NOT a prime number';
}
}
希望这对您有用。
答案 9 :(得分:0)
<?php
function primeCheck($num)
{
if ($num == 1)
return false;
for ($i = 2; $i <= $num/2; $i++)
{
if ($num % $i == 0)
{
return false;
}
}
return true;
}
$primeNumber = primeCheck(17);
if ($primeNumber == true)
{
echo "Is Prime";
}
else
{
echo "Is Not Prime";
}
?>
答案 10 :(得分:0)
function is_prime($number)
{
return (bool) !preg_match('/^1?$|^(11+?)\1+$/x', str_repeat('1', $number));
}
答案 11 :(得分:0)
$num = ceil(sqrt($num));
$is_prime = true;
for($j=3; $j<=$num; $j=$j+2){
if($i%$j == 0){
$is_prime = false;
break;
}
}
if($is_prime){
echo "No is Prime";
}
注意:从2开始循环,因为它是唯一的偶数素数。增加2,因为没有甚至没有是素数。
=&GT;查找范围内所有素数的代码(2-100)
$limit = 100; $arr = array(2);
for($i=3; $i<=$limit; $i=$i+2){
$num = ceil(sqrt($i));
$is_prime = true;
for($j=3; $j<=$num; $j=$j+2){
if($i%$j == 0){
$is_prime = false;
break;
}
}
if($is_prime){
$arr[] = $i;
}
}
答案 12 :(得分:0)
您可以打印“Prime”作为函数的返回,以确保在函数期间不会打印任何内容,除了“NOT prime”的条件。
class IsPrime
{
function check($num)
{
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
break;
}
}
return "Prime";
}
}
$x = new IsPrime();
echo $x->check(4);
答案 13 :(得分:0)
放入其他部分,否则它将始终return Prime
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
break;
}
echo 'Prime';
}
答案 14 :(得分:0)
试试这个
<Button x:Name="SearchButton"
Clicked="SearchButton_OnClicked"/>
答案 15 :(得分:0)
请检查
class IsPrime
{
function check($num)
{
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
break;
}
else
{
echo 'Prime';
}
}
//echo 'Prime';
}
}
$x = new IsPrime();
$x->check(3);
答案 16 :(得分:0)
只需使用return:
class IsPrime
{
function check($num)
{
for ($i = 2; $i < $num; $i++)
{
if ($num % $i == 0)
{
echo 'NOT prime';
return; // that you need
}
}
echo 'Prime';
}
}
$x = new IsPrime();
$x->check(4);
答案 17 :(得分:-2)
这是我的解决方案。如果你把条件放在循环中并在它之后中断,它就永远不会完成检查。
$num = rand ( 1, 1000 );
$notPri = null;
for($check = 2; $check < $num; $check ++) {
if ($num % $check == 0) {
$notPri ++;
}
}
if ($neEpri == 0) {
echo $num . "<br>Prime!";
} else {
echo $num . "<br>Not a prime!";
}