147 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								id: 5eb3e4aa847216613aa81983
							 | 
						||
| 
								 | 
							
								title: Semiprime
							 | 
						||
| 
								 | 
							
								challengeType: 5
							 | 
						||
| 
								 | 
							
								forumTopicId: 385318
							 | 
						||
| 
								 | 
							
								dashedName: semiprime
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --description--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Semiprime numbers are natural numbers that are products of exactly two (possibly equal) [prime numbers](https://rosettacode.org/wiki/prime_number).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<pre>1679  =  23 x 73</pre>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --instructions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Write a function that returns true if a number is semiprime, or false if it is not.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --hints--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime` should be a function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert(typeof isSemiPrime === 'function');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(100)` should return a boolean.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert(typeof isSemiPrime(100) === 'boolean');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(100)` should return `false`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(100), false);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(504)` should return `false`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(504), false);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(4)` should return `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(4), true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(46)` should return `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(46), true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(13)` should return `false`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(13), false);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(74)` should return `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(74), true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(1679)` should return `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(1679), true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(2)` should return `false`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(2), false);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(95)` should return `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(95), true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`isSemiPrime(124)` should return `false`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(isSemiPrime(124), false);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --seed--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## --seed-contents--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function isSemiPrime(n) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --solutions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function isSemiPrime(n) {
							 | 
						||
| 
								 | 
							
								  if (n <= 3) return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var ans = [];
							 | 
						||
| 
								 | 
							
								  var done = false;
							 | 
						||
| 
								 | 
							
								  while (!done) {
							 | 
						||
| 
								 | 
							
								    if (n % 2 === 0) {
							 | 
						||
| 
								 | 
							
								      ans.push(2);
							 | 
						||
| 
								 | 
							
								      n /= 2;
							 | 
						||
| 
								 | 
							
								      continue;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (n % 3 === 0) {
							 | 
						||
| 
								 | 
							
								      ans.push(3);
							 | 
						||
| 
								 | 
							
								      n /= 3;
							 | 
						||
| 
								 | 
							
								      continue;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (n === 1) return ans.length == 2;
							 | 
						||
| 
								 | 
							
								    var sr = Math.sqrt(n);
							 | 
						||
| 
								 | 
							
								    done = true;
							 | 
						||
| 
								 | 
							
								    // try to divide the checked number by all numbers till its square root.
							 | 
						||
| 
								 | 
							
								    for (var i = 6; i <= sr; i += 6) {
							 | 
						||
| 
								 | 
							
								      if (n % (i - 1) === 0) {
							 | 
						||
| 
								 | 
							
								        // is n divisible by i-1?
							 | 
						||
| 
								 | 
							
								        ans.push(i - 1);
							 | 
						||
| 
								 | 
							
								        n /= i - 1;
							 | 
						||
| 
								 | 
							
								        done = false;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (n % (i + 1) === 0) {
							 | 
						||
| 
								 | 
							
								        // is n divisible by i+1?
							 | 
						||
| 
								 | 
							
								        ans.push(i + 1);
							 | 
						||
| 
								 | 
							
								        n /= i + 1;
							 | 
						||
| 
								 | 
							
								        done = false;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ans.push(n);
							 | 
						||
| 
								 | 
							
								  return ans.length == 2;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 |