печать простой номер [дубликат]

  / * Эта программа будет печатать слова для числа от 0 до 99999 * / public class NumberInWords5Digits {static int testcase1 = 93284;  public static void main (String args []) {NumberInWords5Digits testInstance = new NumberInWords5Digits ();  Строковый результат = testInstance.inWords (testcase1);  System.out.println ("Результат:" + результат);  } // напишите свой код здесь public String inWords (int num) {int digit = 0;  Строковое слово = "";  int temp = num;  while (temp & gt; 0) {if (temp% 10 & gt; = 0) digit ++;  temp = temp / 10;  } if (num == 0) возвращает «ноль»;  System.out.println (число);  if (digit == 1) word = inTens (num, digit);  else if (digit == 2) word = inTens (num, digit);  else if (digit == 3) word = inHundreds (num, digit);  else if (digit == 4) word = inThousands (num, digit);  else if (digit == 5) word = inThousands (num, digit);  возвращаемое слово;  } public String inTens (int num, int digit) {int tens = 0;  int units = 0;  if (digit == 2) {tens = num / 10;  units = num% 10;  } String unit = "";  Строка ten = "";  Строковое слово = "";  if (num == 10) {word = "ten";  return word;} if (num == 11) {word = "eleven";  return word;} if (num == 12) {word = "двенадцать";  return word;} if (num == 13) {word = "тринадцать";  return word;} if (num == 14) {word = "fourteen";  return word;} if (num == 15) {word = "пятнадцать";  return word;} if (num == 16) {word = "sixteen";  return word;} if (num == 17) {word = "семнадцать";  return word;} if (num == 18) {word = "восемнадцать";  return word;} if (num == 19) {word = "девятнадцать";  return word;} if (units == 1 || num == 1) unit = "one";  else if (units == 2 || num == 2) unit = "two";  else if (units == 3 || num == 3) unit = "three";  else if (units == 4 || num == 4) unit = "four";  else if (units == 5 || num == 5) unit = "five";  else if (units == 6 || num == 6) unit = "six";  else if (units == 7 || num == 7) unit = "seven";  else if (units == 8 || num == 8) unit = "eight";  else if (units == 9 || num == 9) unit = "девять";  если (десятки == 2) десять = «двадцать»;  иначе если (десятки = 3) десять = «тридцать»;  иначе если (десятки = 4) десять = «сорок»;  иначе если (десятки = 5) десять = «пятьдесят»;  иначе если (десятки = 6) десять = «шестьдесят»;  иначе если (десятки = 7) десять = «семьдесят»;  иначе если (десятки = 8) десять = «восемьдесят»;  иначе если (десятки = 9) десять = «девяносто»;  if (digit == 1) word = unit;  else if (digit == 2) word = ten + "" + unit;  возвращаемое слово;  } // inHundreds (525, 3) public String inHundreds (int num, int digit) {int hundred = num / 100;  // = 5 int tensAndUnits = num% 100;  // = 25 String hundred = "";  Строка tenAndUnit = "";  Строковое слово = "";  tenAndUnit = inTens (tensAndUnits, 2);  если (сотни == 1) сто = «сто»;  иначе, если (сотни == 2) сто = «двести»;  иначе, если (сотни == 3) сто = «триста»;  else if (сотни == 4) сто = "четыреста";  иначе, если (сотни == 5) сто = «пятьсот»;  иначе, если (сотни == 6) сто = «шестьсот»;  иначе если (сотни == 7) сто = «семьсот»;  иначе если (сотни = 8) сто = «восемьсот»;  иначе, если (сотни = 9) сто = «девятьсот»;  word = сто + "" + tenAndUnit;  возвращаемое слово;  } public String inThousands (int num, int digit) {int thousand = 0;  int hundredAndOthers = num% 1000;  String тыс. = "";  Строка 100AndOther = "";  Строковое слово = "";  if (digit == 5) {тыс. = num / 1000;  тыс. = inTens (тыс., 2);  } else if (digit == 4) {тыс. = num / 1000;  тыс. = inTens (тыс., 1);  } if (сотниAndOthers / 100 == 0) // в случае «023» стоAndOther = inTens (сотниAndOthers, 2);  else hundredAndOther = inHundreds (сотниAndOthers, 3);  слово = тысяча + "тысяча" + сотняДругое;  возвращаемое слово;  }}  
9
задан HamZa 27 May 2013 в 16:29
поделиться

19 ответов

Вот небольшая функция, которую я нашел: ( http://icdif.com/computing/2011/09/15/check-number-prime-number/ ) Казалось, что я работаю для меня!

function isPrime($num) {
    //1 is not prime. See: http://en.wikipedia.org/wiki/Prime_number#Primality_of_one
    if($num == 1)
        return false;

    //2 is prime (the only even number that is prime)
    if($num == 2)
        return true;

    /**
     * if the number is divisible by two, then it's not prime and it's no longer
     * needed to check other even numbers
     */
    if($num % 2 == 0) {
        return false;
    }

    /**
     * Checks the odd numbers. If any of them is a factor, then it returns false.
     * The sqrt can be an aproximation, hence just for the sake of
     * security, one rounds it to the next highest integer value.
     */
    $ceil = ceil(sqrt($num));
    for($i = 3; $i <= $ceil; $i = $i + 2) {
        if($num % $i == 0)
            return false;
    }

    return true;
}
33
ответ дан Farkie 15 August 2018 в 22:10
поделиться
  • 1
    Требуется ли количество потолка квадратного корня или достаточно пола? У меня возникли проблемы с мыслью о количестве, которое будет делиться потолком квадратного корневого номера – Curtis W 21 April 2014 в 22:57
  • 2
    ... $sqrt = ceil(sqrt($num)); ... если вы вычисляете sqrt за пределами цикла for, это ускорит работу на ~ 400%, особенно при проверке большого количества больших чисел – nimmneun 24 December 2015 в 02:00
  • 3
    Привет @Farkie, вы попробовали? neun@mono:~$ php test.php float(7.9089679718018) neun@mono:~$ php test2.php float(2.5886662006378) ` – nimmneun 7 February 2016 в 18:11
  • 4
    Также может быть написано как: for($i = 3; $i <= $ceil; $i += 2) { – Oliver Tappin 28 December 2016 в 10:10
  • 5
    Имеет ли смысл проверять / 9, если номер не работает / 3? Я имею в виду, что нет смысла $num % $i, где $ i не является простым. – iXCray 11 August 2017 в 21:41

Лучший способ проверить, является ли число простым, - это увидеть, делится ли оно каким-либо простым числом перед ним. Pi (x) - это тот, который я все время вижу повсюду ... Вы можете увидеть немного больше информации о Prime Counting на wikipedia .

Итак, самый эффективный способ, который я могу придумать на данный момент следующее:

class prime
{
    public $primes = [ 2, 3, 5, 7 ];
    public $not_prime = [ 1, 4, 6, 8, 9 ];
    public function is_prime( int $n )
    {
        if ( $n <= 1 ) return false;
        if ( in_array( $n, $this->primes ) ) return true;
        if ( in_array( $n, $this->not_prime ) ) return false;
        for( $i = 0; $i < count( array_slice( $this->primes, 0, $this->prime_count( $n ) ) ) || $i == $n; $i++ )
        {
            if ( $n % $this->primes[ $i ] == 0 ) return false;
        }
        return true;
    }
    public function build_primes_to( int $n )
    {
        for ( $i = end( $this->primes ) + 1; $i <= $n; $i++ )
        {
            if ( $this->is_prime( $i ) )
            {
                $this->primes[] = $i;
            }
            else
            {
                $this->not_prime[] = $i;
            }
        }
    }
    public function prime_count( $n )
    {
        $ln = log( $n );
        if ( $ln == 0 ) return 1;
        return intval( ceil( $n / $ln ) );
    }
}

Это не очень эффективно, ну, а не когда дело доходит до создания списка простых чисел ... Я работал лучше для создания списка здесь , хотя было бы легко и гораздо эффективнее найти список в Интернете и использовать его.

Использование вышеперечисленного было бы в соответствии с :

$find_to = 1000;
$prime = new prime();
$prime->build_primes_to( $find_to );
print "<pre>";
for ( $i = 1; $i < $find_to; $i++ )
{
    print "$i is " . ( !$prime->is_prime( $i ) ? "not " : "" ) . "prime\n";
}
0
ответ дан Alexander Holman 15 August 2018 в 22:10
поделиться
$n = 7;

if ($n == 1) {
    echo 'Not a Prime or Composite No.';
}

$set = 0;
for ($index = 2; $index <= $n/2; $index++) {

    if ($n % $index === 0) {
        $set = 1;
        break;
    }
}

if ($set) {
    echo 'Composite';
} else {
    echo 'Prime';
}
0
ответ дан Ashish 15 August 2018 в 22:10
поделиться

Я знаю, что это немного поздно, но вот простая программа, которая поможет вам сделать то, что вы просите ...

<?php 
 //Prime Function
 function fn_prime($number) {
    $i = 2; $result = TRUE;
    while($i < $number) {
        if(!($number%$i)) {
            $result = FALSE;
        }
        $i++;
    }
    return $result;
 }

//Declare integer variable...
$k = 0;

//Start Loop up to any number of your choice for e.g. 200
while($k < 200) {
    if(fn_prime($k)) {
        echo "$k is a prime number<br/>";
    } else {
        echo "$k is not a prime number!<br/>";
    }
    $k++;
}

?>
0
ответ дан Chigozie Orunta 15 August 2018 в 22:10
поделиться

Исправлена ​​версия ответа @Farkie, специально предназначенная для проверки простых чисел в циклах.

function isPrime_v2($num) {
    static $knownPrimes=[3]; // array to save known primes

    if($num == 1)
        return false;

    if($num == 2 || $num == 3) //added '3'
        return true;

    if($num % 2 == 0)
        return false;

    $ceil = ceil(sqrt($num)); //same purpose, good point from Farkie

    // Check against known primes to shorten operations
    // There is no sense to check agains numbers in between
    foreach($knownPrimesas $prime){
        if ($prime>$ceil)
            break;
        if($num===$prime)
            return true;
        if($num % $prime == 0)
            return false;
    }


    /**
     * end($knownPrimes) % 2 !==0 - mathematically guaranteed
     * start with latest known prime
     */
    for($i = end($knownPrimes)+2; $i <= $ceil; $i = $i + 2) {
        if($num % $i == 0)
            return false;
    }
    $knownPrimes[]=$num;
    return true;
}

Тест с phpfiddle.org. V1 - ответ Farkie, V2 - расширенная версия

V1 (1 to 5,000,000): divisions=330 929 171; primes=348 513; time=21.243s
V2 (1 to 5,000,000): divisions=114 291 299; primes=348 513; time=10.357s

ПРИМЕЧАНИЕ! Функция isPrime_v2 применима ТОЛЬКО в случае петли с 3. В противном случае сохраненный массив $ knownPrimes будет иметь недостаточную историю.

0
ответ дан iXCray 15 August 2018 в 22:10
поделиться
  • 1
    В конечном итоге у вас не хватит памяти, если вы запустите это настолько большое, но это будет быстрее (кэширование) :) – Farkie 12 August 2017 в 15:14

Вот один лайнер, который я нашел некоторое время назад, чтобы проверить простые числа. Для определения:

function is_prime_via_preg_expanded($number) {
    return !preg_match('/^1?$|^(11+?)\1+$/x', str_repeat('1', $number));
}

использует знаковые метки (унарная математика). Проверяйте все числа последовательно для простых чисел:

$i=2; // start here (2 is the first prime)
while (1) { // neverending loop
    if (is_prime_via_preg_expanded($i)) echo $i." <br />\n";
    $i++;
}

Чтобы проверить только диапазон чисел для простых чисел, например, в приведенный пример:

$start = 2; // start here (2 is the first prime)
$end = 100;

$i=$start;
while ($i<=$end) {
    if (is_prime_via_preg_expanded($i)) echo $i." <br />\n";
    $i++;
}
7
ответ дан Jeff Clayton 15 August 2018 в 22:10
поделиться
  • 1
    Это ужасно УДИВИТЕЛЬНЫЙ Джефф! – pimbrouwers 4 June 2015 в 00:12
  • 2
    Это одно замечательно для однократных проверок. Но эта функция намного медленнее, чем предоставленные альтернативы с использованием петель. – Julius Š. 1 July 2017 в 11:33
<?php

    $n = 11;
    $o = $_POST["maxprime"];
    echo 'The script calculated the next primenumbers:</br>';
    echo '2, 3, 5, 7, ';
    while (true) { 
        $t = 6;
        while (true) { 
            if ($n % ($t - 1) == 0) {
                break;
            } 
            if ($n % ($t + 1) == 0) {
                break;
            }
            if ($t > sqrt($n)) {
                echo("$n,  "); 
                break;
            } 
            $t += 6; 
        }
        if (($n + 1) % 6 == 0) {
            $n += 2;
        } else {
            $n += 4;
        } 
        if ($n > $o) {
            break;
        }
    }

?>

http://www.primenumbergenerator.com/

3
ответ дан joan16v 15 August 2018 в 22:10
поделиться

Я знаю, что это происходит поздно, но надеюсь, что это кому-то поможет.

    function prime_number_finder($range)
    {
        $total_count=0;//intitialize the range keeper

        $i=1;//initialize the numbers to check

        while ($total_count<=$range)
        {
           $count=0;//initialize prime number inner count
           $k=$i;
           while ($k!=0)
           {

             if(($i%$k)==0)
             {
              $count++;
             }
              $k--;
           }
           //condition to check if a number is prime 
          if($count==2 || $count==1)
           {
            echo $i."</br>";//output the prime number;
            $total_count++;
            $i++;

           }
           //number is not prime
           if($count>2)
           {
             //$total_count++;
            $i++;
           }

        }
    }

// пример prime_number_finder (200);

0
ответ дан lukkystunt 15 August 2018 в 22:10
поделиться
  • 1
    Помните, что это последняя строка вашего ответа? & quot; // пример prime_number_finder (200); & quot; – 2rs2ts 9 April 2014 в 15:16
  • 2
    prime_number_finder (200) является просто примером того, как работает эта функция, пример получает первые 200 простых чисел из натуральных чисел. – lukkystunt 9 April 2014 в 18:12
  • 3
    Вы имеете в виду, что вы пытаетесь вызвать его? – 2rs2ts 9 April 2014 в 18:13
  • 4
    да ... чтобы вызвать функцию – lukkystunt 9 April 2014 в 18:16
  • 5
    Хорошо, вы должны сделать это более ясно в следующий раз. Добро пожаловать в SO! – 2rs2ts 9 April 2014 в 18:18

Sieve_of_Eratosthenes - простой и быстрый алгоритм для нахождения простых чисел.

function getPrimes($finish)
    {
        $number = 2;
        $range = range($number,$finish);
        $primes = array_combine($range,$range);
        while($number*$number < $finish){
            for($i=$number; $i<=$finish; $i+=$number){
                if($i==$number){
                    continue;
                }
                unset($primes[$i]);
            }
            $number = next($primes);
        }
        return $primes;
    }
0
ответ дан mocak 15 August 2018 в 22:10
поделиться
  • 1
    getPrimes(25) возвращает 25 как простое число, то же самое для getPrimes(49) и 49. Только кажется, что когда конечная точка является квадратным числом, хотя и не для всех из них. – DevFox 22 September 2016 в 16:34

Эта базовая реализация:

function prima($n){

  for($i=1;$i<=$n;$i++){  //numbers to be checked as prime

          $counter = 0; 
          for($j=1;$j<=$i;$j++){ //all divisible factors


                if($i % $j==0){ 

                      $counter++;
                }
          }

        //prime requires 2 rules ( divisible by 1 and divisible by itself)
        if($counter==2){

               print $i." is Prime <br/>";
        }
    }
} 

prima(20);  //find prime numbers from 1-20

Здесь будет выводиться

 2 is Prime 
 3 is Prime 
 5 is Prime 
 7 is Prime 
 11 is Prime 
 13 is Prime 
 17 is Prime 
 19 is Prime 

Полная логика пошаговая и визуальная аналогия здесь: Здесь

6
ответ дан ngakak 15 August 2018 в 22:10
поделиться

Я знаю это слишком поздно, но я обнаружил, что это решение намного лучше и проще

function isPrime($num)
{
    if ($num < 2) {
        return false;
    }
    for ($i = 2; $i <= $num / 2; $i++) {
        if ($num % $i == 0) {
            return false;
        }
    }

    return true;
}
0
ответ дан Nik Latkin 15 August 2018 в 22:10
поделиться

Все, что является sqrt (), является ложным или любое значение float является простым числом

2
ответ дан Nikba 15 August 2018 в 22:10
поделиться
  • 1
    это неверно. подумайте о 6, чей sqrt() является поплавком, но сам по себе не является простым числом. должен быть; sqrt () простого числа - это всегда float, который вы можете использовать для ускорения процесса принятия решения при переходе через множество чисел. – keune 14 September 2014 в 09:19
  • 2
    @keune Это верно в примере четного числа, но функция в этом случае не учитывает. Вы правы; все числа считаются, что утверждение не стоит само по себе. – dsimer 21 January 2015 в 22:49

Вы можете использовать эту функцию PHP gmp_nextprime()

11
ответ дан NullPoiиteя 15 August 2018 в 22:10
поделиться
  • 1
    Хотя это не всегда доступно: / – fejese 26 May 2013 в 21:43
  • 2
    Вам понадобится математическое расширение GNU Multiple Precision (GMP), которое будет установлено – itsazzad 1 February 2014 в 21:51
<?php 
$limit=100;

$i=1;


outer:while($i<=$limit){
    $j=2;
    while($j<$i){
        if($i%$j==0){
            $i++;
            goto outer;
        }
        $j++;
    }
    echo $i;
    echo "<br/>";
    $i++;
}


?>
0
ответ дан Rishi 15 August 2018 в 22:10
поделиться

Вот еще один очень простой, но тихий эффективный подход:

function primes($n){

    $prime = range(2 , $n);

    foreach ($prime as $key => $value) {

        for ($i=2; $i < $value ; $i++) { 

            if (is_int($value / $i)) {

                unset($prime[$key]);
                break;
            }
        }
    }

    foreach ($prime as $value) {
        echo $value.'<br>';
    }
}

primes(1000);
0
ответ дан Rmy5 15 August 2018 в 22:10
поделиться

Найти простые числа от 1 до 10000, используя замыкание в array_filter ():

$start = 2;
$step = 10000;

$stop = $start + $step;
$candidates = range($start, $stop);    
for($num = 2; $num <= sqrt($stop); ++$num){                        
    $candidates = array_filter($candidates,
        function ($v) use (&$num){
             return ($v % $num) != 0 || $v == $num ;
        }
    );
}
print_r($candidates);

Edit: 1 не является простым числом

0
ответ дан user3396065 15 August 2018 в 22:10
поделиться
  • 1
    Ничего, кроме того, что он дает 1 как простое число. – DevFox 23 August 2016 в 21:03
  • 2
    Просто начните с 2 вместо 1, спасибо за сообщение! – user3396065 24 August 2016 в 20:59

Это, я считаю, довольно эффективная процедура, в которой перечислены все простые числа до 1000.

Он проверяет каждое число ($ x), чтобы увидеть, есть ли у него какие-либо факторы (кроме сам и 1, конечно).

Математически нет необходимости проверять все нижние числа как возможные факторы, а только младшие простые числа до квадратного корня из $ x. Это активируется путем хранения простых чисел, поскольку они находятся в массиве (который, я думаю, является стратегией, к которой обращался OP).

Как только первый основной коэффициент найден, мы знаем, что $ x является не простое, и поэтому дальнейшее тестирование этого значения $ x не требуется, и мы можем выйти из цикла foreach.

$primes = array();
for ($x = 2; $x <= 1000; $x++) {
    $xIsPrime = TRUE;
    $sqrtX = sqrt($x);
    foreach ($primes as $prime) if ($prime > $sqrtX || ((!($x % $prime)) && (!$xIsPrime = FALSE))) break;
    if ($xIsPrime) echo ($primes[] = $x)  . "<br>";
}
1
ответ дан WebSmithery 15 August 2018 в 22:10
поделиться
0
ответ дан iXCray 5 September 2018 в 21:52
поделиться
3
ответ дан joan16v 5 September 2018 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: