/ * Эта программа будет печатать слова для числа от 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); слово = тысяча + "тысяча" + сотняДругое; возвращаемое слово; }}
Вот небольшая функция, которую я нашел: ( 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;
}
Лучший способ проверить, является ли число простым, - это увидеть, делится ли оно каким-либо простым числом перед ним. 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";
}
$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';
}
Я знаю, что это немного поздно, но вот простая программа, которая поможет вам сделать то, что вы просите ...
<?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++;
}
?>
Исправлена версия ответа @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
ПРИМЕЧАНИЕ! Функция
blockquote>isPrime_v2
применима ТОЛЬКО в случае петли с 3. В противном случае сохраненный массив $ knownPrimes будет иметь недостаточную историю.
Вот один лайнер, который я нашел некоторое время назад, чтобы проверить простые числа. Для определения:
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++;
}
<?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;
}
}
?>
Я знаю, что это происходит поздно, но надеюсь, что это кому-то поможет.
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);
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;
}
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
Полная логика пошаговая и визуальная аналогия здесь: Здесь
Я знаю это слишком поздно, но я обнаружил, что это решение намного лучше и проще
function isPrime($num)
{
if ($num < 2) {
return false;
}
for ($i = 2; $i <= $num / 2; $i++) {
if ($num % $i == 0) {
return false;
}
}
return true;
}
Все, что является sqrt (), является ложным или любое значение float является простым числом
sqrt()
является поплавком, но сам по себе не является простым числом. должен быть; sqrt () простого числа - это всегда float, который вы можете использовать для ускорения процесса принятия решения при переходе через множество чисел.
– keune
14 September 2014 в 09:19
Вы можете использовать эту функцию PHP gmp_nextprime()
<?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++;
}
?>
Вот еще один очень простой, но тихий эффективный подход:
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);
Найти простые числа от 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 не является простым числом
Это, я считаю, довольно эффективная процедура, в которой перечислены все простые числа до 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>";
}
$sqrt = ceil(sqrt($num));
... если вы вычисляете sqrt за пределами цикла for, это ускорит работу на ~ 400%, особенно при проверке большого количества больших чисел – nimmneun 24 December 2015 в 02:00neun@mono:~$ php test.php float(7.9089679718018) neun@mono:~$ php test2.php float(2.5886662006378)
` – nimmneun 7 February 2016 в 18:11for($i = 3; $i <= $ceil; $i += 2) {
– Oliver Tappin 28 December 2016 в 10:10$num % $i
, где $ i не является простым. – iXCray 11 August 2017 в 21:41