04-06-2006 8:50 AM
Dear Experts
Again This is venky
Display between 1 to 100 prime numbers ? write abap program for that.
prime number : - a number which is divisable by 1 or itself.
Advance in Thnx
04-06-2006 8:55 AM
Hi Venkatesh
Check this out u will find a solution for your question
PROGRAM zprimes.
DATA: BEGIN OF primes OCCURS 0,
number TYPE i,
exp TYPE i,
END OF primes.
DATA: w_mult TYPE i,
w_limi TYPE i,
w_prem TYPE i.
DATA: w_outp TYPE text132.
DATA: w_rtime TYPE i,
w_stime TYPE p DECIMALS 3.
DEFINE add_part.
sy-fdpos = strlen( &1 ) + 1.
&1+sy-fdpos(*) = &2.
condense &1.
END-OF-DEFINITION.
PARAMETERS: p_numb TYPE i, "number to check
p_fact TYPE c AS CHECKBOX, "display components
p_nbpr TYPE c AS CHECKBOX. "nb of primes
START-OF-SELECTION.
GET RUN TIME FIELD w_rtime.
IF p_nbpr IS INITIAL OR p_numb LE 12000.
PERFORM eratostene USING p_numb.
add_part w_outp p_numb.
READ TABLE primes WITH KEY number = p_numb.
IF sy-subrc = 0.
add_part w_outp 'is prime'.
ELSE.
IF p_fact IS INITIAL.
add_part w_outp 'is not prime'.
ELSE.
add_part w_outp '='.
w_limi = p_numb.
LOOP AT primes WHERE exp GT 0.
CHECK primes-number LE w_limi.
IF w_prem GT 0.
add_part w_outp '*'.
ENDIF.
IF primes-exp GT 1.
add_part w_outp '('.
add_part w_outp primes-number.
add_part w_outp '^'.
add_part w_outp primes-exp.
add_part w_outp ')'.
ELSE.
add_part w_outp primes-number.
ENDIF.
w_limi = w_limi / ( primes-number ** primes-exp ).
IF w_limi = 1.
EXIT.
ENDIF.
w_prem = 1.
ENDLOOP.
ENDIF.
ENDIF.
WRITE: / w_outp.
IF NOT p_nbpr IS INITIAL.
DESCRIBE TABLE primes LINES sy-tmaxl.
CLEAR: w_outp.
add_part w_outp 'Number of primes:'.
add_part w_outp sy-tmaxl.
WRITE: / w_outp.
SKIP.
LOOP AT primes.
WRITE: / primes-number.
ENDLOOP.
ENDIF.
ELSE.
PERFORM factors.
ENDIF.
GET RUN TIME FIELD w_rtime.
w_stime = w_rtime / 1000000.
SKIP.
CLEAR: w_outp.
add_part w_outp 'Calculation time:'.
add_part w_outp w_stime.
WRITE: / w_outp.
----
FORM eratostene *
----
FORM eratostene USING in_number TYPE i.
DATA: BEGIN OF no_primes OCCURS 0,
number TYPE i,
END OF no_primes.
DATA: cnum TYPE i,
dnum TYPE i,
limi TYPE i,
mult TYPE i,
puis TYPE i,
cmod TYPE i.
IF NOT ( p_fact IS INITIAL AND p_nbpr IS INITIAL ).
limi = in_number.
ELSE.
limi = sqrt( in_number ).
ENDIF.
cnum = 2.
WHILE cnum LE limi.
READ TABLE no_primes WITH KEY number = cnum.
IF sy-subrc NE 0.
primes-number = cnum.
mult = 2.
puis = 1.
dnum = mult * cnum.
WHILE dnum LE in_number.
READ TABLE no_primes WITH KEY number = dnum.
IF sy-subrc NE 0.
no_primes-number = dnum.
APPEND no_primes.
ENDIF.
IF NOT p_fact IS INITIAL.
cmod = dnum MOD ( cnum ** puis ).
IF cmod = 0.
cmod = in_number MOD ( cnum ** puis ).
IF cmod = 0.
primes-exp = puis.
puis = puis + 1.
ENDIF.
ENDIF.
ENDIF.
mult = mult + 1.
dnum = mult * cnum.
ENDWHILE.
APPEND primes.
CLEAR: primes.
ENDIF.
cnum = cnum + 1.
ENDWHILE.
ENDFORM.
----
FORM factors *
----
FORM factors.
DATA: ex_factors TYPE string,
mod TYPE i,
still TYPE f,
factor TYPE i,
exponent TYPE i,
square TYPE f,
fac_string TYPE text40,
exp_string TYPE text40.
IF p_numb LE 3.
ex_factors = p_numb.
ELSE.
factor = 2.
still = p_numb.
DO.
CLEAR: exponent.
mod = still MOD factor.
WHILE mod = 0.
exponent = exponent + 1.
still = still div factor.
mod = still MOD factor.
ENDWHILE.
IF exponent EQ 1.
fac_string = factor.
CONCATENATE ex_factors '*' fac_string
INTO ex_factors
SEPARATED BY space.
CONDENSE ex_factors.
ELSEIF exponent GT 1.
fac_string = factor.
exp_string = exponent.
CONCATENATE ex_factors '* (' fac_string
'^' exp_string ')'
INTO ex_factors
SEPARATED BY space.
CONDENSE ex_factors.
ENDIF.
factor = factor + 1.
square = factor ** 2.
IF square GT still.
EXIT.
ENDIF.
ENDDO.
IF still GT 1.
CATCH SYSTEM-EXCEPTIONS convt_overflow = 1.
fac_string = factor = still.
ENDCATCH.
IF sy-subrc NE 0.
fac_string = still.
ENDIF.
CONCATENATE ex_factors '*' fac_string
INTO ex_factors
SEPARATED BY space.
CONDENSE ex_factors.
ENDIF.
SHIFT ex_factors UP TO '*'.
SHIFT ex_factors BY 2 PLACES.
ENDIF.
WRITE: / p_numb RIGHT-JUSTIFIED.
IF ex_factors CA '*^'.
WRITE: '=', ex_factors.
ELSE.
WRITE: 'is prime'.
ENDIF.
ENDFORM.
check the p_nbpr checkbox to get the number of prime numbers within that number.
Regards,
Santosh
04-06-2006 8:57 AM
04-06-2006 9:01 AM
PARAMETERS low TYPE i.
PARAMETERS high TYPE i.
DATA num TYPE i.
DATA is_prime.
num = low.
DO.
PERFORM prime.
IF is_prime EQ 'X'.
WRITE: / num.
ENDIF.
num = num + 1.
IF num GT high.
EXIT.
ENDIF.
ENDDO.
FORM prime.
DATA i TYPE i VALUE 2.
DATA mod TYPE i.
is_prime = 'X'.
DATA max TYPE i.
DATA cnt TYPE i VALUE 0.
max = num / 2.
IF num EQ 4.
is_prime = ' '.
EXIT.
ENDIF.
DO.
IF i GE max.
is_prime = 'X'.
EXIT.
ENDIF.
mod = num MOD i.
IF mod EQ 0. "Not prime
is_prime = ' '.
EXIT.
ENDIF.
cnt = cnt + 1.
IF cnt GT max.
EXIT.
ELSE.
i = i + 1.
ENDIF.
ENDDO.