Partition an integer x into n primes: Difference between revisions

m
→‎{{header|REXX}}: split some DO-END statements, added/changed commands and whitespace, simplified a pluralizer.
m (→‎{{header|Phix}}: " + " output)
m (→‎{{header|REXX}}: split some DO-END statements, added/changed commands and whitespace, simplified a pluralizer.)
Line 1,581:
do until what=='' /*possibly process a series of integers*/
parse var what x n what; parse var x x '-' y /*get possible range and # partitions.*/
parse var n n '-' m /*get possible" " " " " " range and # partitions.*/
if x=='' | x=="," then x=19 19 /*Not specified? Then use the default.*/
if y=='' | y=="," then y=x x /* " " " " " " */
if n=='' | n=="," then n= 3 3 /* " " " " " " */
if m=='' | m=="," then m=n n /* " " " " " " */
call genP y /*generate Y number of primes. */
do g=x to y /*partition X ───► Y into partitions.*/
do q=n to m; call part; end /*q*/ /*partition " G into Q primes. */
end end /*gq*/
end /*g*/
end /*until*/
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
genP: arg high; @.1= 2; @.2= 3; #=2 2 /*get highest prime, assign some vars. */
do j=@.#+2 by 2 until @.#>high /*only find odd primes from here on. */
do k=2 while k*k<=j /*divide by some known low odd primes. */
if j // @.k==0 then iterate j /*Is J divisible by P? Then ¬ prime.*/
end /*k*/ /* [↓] a prime (J) has been found. */
#= # + 1; @.#=j @.#= j /*bump prime count; assign prime to @.*/
end /*j*/
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
getP: procedure expose i. p. @.; parse arg z /*bump the prime in the partition list.*/
if i.z==0 then do; _= z - 1; i.z= i._; end
i.z= i.z + 1; _= i.z; p.z= @._; return 0
return 0
/*──────────────────────────────────────────────────────────────────────────────────────*/
list: _= p.1; if $==g then do j=2 to q; _= _ p.j; end; else _= '__(not_possible)'
the= 'primes:'; if q==1 then the= 'prime: '; return the translate(_,"+ ",' _') end /*j*/
else _= '__(not_possible)'
return 'prime' || word('s', 1 + (q==1)) translate(_, "+ ", ' _') /*plural?*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
part: i.= 0; do j=1 for q; call getP j; end /*j*/
do !=0 by 0; $=0 /*!: a DO variable for LEAVEend & ITERATE /*j*/
do !=0 by 0; do s=1 for q; $=$+p.s 0 /*!: [↓] a isDO sumvariable of thefor primesLEAVE too& large?ITERATE*/
do s=1 if $>gfor then doq; if s $==1 $ then+ leavep.s ! /* [↓] is /*performsum of the aprimes quicktoo exitlarge?*/
if $>g then do; if do ks=s=1 then leave to! q; i.k=0; /*perform a quick end /*kexit?*/
do rk=s-1 to q; calli.k= getP r0; end /*rk*/
iterate ! do r=s-1 to q; call getP r; end /*r*/
end iterate !
end /*s*/ end
if $==g then leave end /*is sum of the primes exactly right ? s*/
if $ <==g then do;leave /*is sum of the callprimes getPexactly q;right iterate;? end*/
if $ end<g then /*!*/do; call getP q; iterate; /* [↑] Is sum too low? Bump a prime.*/end
say 'partitioned' center(g,9) end /*!*/ "into" center(q, 5) list() /* [↑] Is sum too low? Bump a prime.*/
say 'partitioned' center(g,9) "into" center(q, 5) list()
return</lang>
{{out|output|text=&nbsp; when using the input of: &nbsp; <tt> 99809 1 &nbsp; 18 2 &nbsp; 19 3 &nbsp;20 4 &nbsp; 2017 24 &nbsp; 22699 1-4 &nbsp; 40355 </tt>}}