My solution is as brute-force as it gets, using only adds and comparisons.
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM35.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 THREE-COUNTER USAGE BINARY-CHAR value 1.
88 IS-THREE VALUE 3.
01 FIVE-COUNTER USAGE BINARY-CHAR value 1.
88 IS-FIVE VALUE 5.
01 SUMMER USAGE BINARY-DOUBLE value zero.
01 I USAGE BINARY-LONG.
01 N USAGE BINARY-LONG.
PROCEDURE DIVISION.
10-MAIN-PROCEDURE.
MOVE 1000000000 TO N.
MOVE 1 TO I.
PERFORM 20-INNER-LOOP WITH TEST AFTER UNTIL I >= N.
DISPLAY SUMMER.
STOP RUN.
20-INNER-LOOP.
IF IS-THREE OR IS-FIVE
ADD I TO SUMMER END-ADD
IF IS-THREE
MOVE 1 TO THREE-COUNTER
ELSE
ADD 1 TO THREE-COUNTER
END-IF
IF IS-FIVE
MOVE 1 TO FIVE-COUNTER
ELSE
ADD 1 TO FIVE-COUNTER
END-IF
ELSE
ADD 1 TO FIVE-COUNTER END-ADD
ADD 1 TO THREE-COUNTER END-ADD
END-IF.
ADD 1 TO I.
EXIT.
END PROGRAM SUM35.
The above code compiles on GnuCOBOL 2.0 and MicroFocus Visual COBOL 2.3. In the latter environment, I was able to get a run time of 7.3 seconds for the 1,000,000,000 iterations (AMD A6-5200 APU running at 2.00 GHz.)I ended up in COBOL via the usual circuitous route through other programming languages after figuring out a solution using mLite. The next postings will demonstrate the mLite and perhaps others.
© Copyright Bruce M. Axtens., 2015
No comments:
Post a Comment