|
|
|
|
|
|
|
Городская олимпиада по информатике 1987 г. - Ответы |
|
|
|
ОТВЕТ . Совершенные числа.
Для каждого натурального числа I, начиная с 4, ищутся его
делители в диапазоне [2, I/2], одновременно суммируются, и, если
сумма равна исходному числу, то оно является ответом. Перебор
можно несколько уменьшить, если рассмотреть интервал [2,sqr(I)].
10 REM СОВЕРШЕННЫЕ ЧИСЛА
20 INPUT N
30 FOR I=4 TO N
40 S=1
50 FOR J=2 TO I/2
60 IF I/J=INT(I/J) THEN S=S+J
70 NEXT J
80 IF S=I THEN PRINT S
90 NEXT I
100 END
К задачам
| | | | | |
ОТВЕТ 2. Определение номера дня с начала года.
Возможны две реализации этой задачи: расчет по формуле
либо последовательные вычисления с учетом числа високосных лет,
подобно задаче 12, часть 2, ОСНОВЫ ИВТ(под ред. Ершова А.П.). р
Предложенная программа реализует второй подход.
Условие "високосности" года :
G/4=int(G/4) и G/100 <> int(G/100) или G/400=int(G/400)
10 REM ДЕНЬ ГОДА
20 INPUT G,N,D
30 PRINT G;N;D
40 IF N*D=0 THEN PRINT"ОШИБКА В ИСХОДНЫХ ДАННЫХ":GOTO 20
50 DIM M(12)
60 R=D
70 IF N<2 THEN H=G-1:GOTO 180
80 IF N=2 THEN H=G-1:LET R=R+31:GOTO 180
90 H=G
100 FOR I=1 TO 12
110 M(I)=31
120 IF I=4 OR I=6 OR I=9 OR I=11 THEN M(I)=30
130 NEXT I
140 M(2)=28
150 FOR I=1 TO N-1
160 R=R+M(I)
170 NEXT I
180 IF H=-1 THEN 290
190 R=R+G*365
200 FOR I=0 TO H STEP 4
210 R=R+1
220 NEXT I
230 FOR I=100 TO H STEP 100
240 R=R-1
250 NEXT I
260 FOR I=400 TO H STEP 400
270 R=R+1
280 NEXT I
290 PRINT R
300 END
К задачам
| | | | | |
ОТВЕТ 3. Квадраты.
Учитывая, что элементами являются числа {0,1,5,7}, можно
использовать следующее соотношение:
A(I,J)+A(I+1,J)+A(I,J+1)+A(I+1,J+1)=13
и далее следует проверить последовательно сумму всех таких
"четверок", для I,J от 1 до N-1.
К задачам
| | | | | |
ОТВЕТ 4.
Заметим, что данная последовательность состоит из чисел вида: x Рi А = 2 аn А* 3 аk А* 5 аp А. Таким образом, задача состоит в постороении упорядоченной последовательности x Рi А, а для этого необходимо организовать последовательное вычисление элементов с возможным возвратом к предыдущим, ранее вычисленным элементам для вставки их в
последовательность на соответствующее по возрастанию место.
В программе приняты следующие обозначения:
B(N)-последовательность построенных элементов;
К(3)-номера элементов(порождающих вершин);
L(3)-новые вершины.
10 INPUT "N=";N20 DIM B(N),K(3),L(3)30 S=1:B(S)=1
40 FOR I=1 TO 3:K(I)=1:NEXT I 50 Z=9.1E+62:PRINT B(S);
60 GOSUB 140:GOSUB 150:GOSUB 160 70 FOR I=1 TO 3:IF Z>L(I) THEN Z=L(I):NEXT I:REM MIN(из 3 вершин) 80 REM номер минимального элемента 90 FOR I=1 TO 3 100 IF L(I)=Z THEN K(I)=K(I)+1110 NEXT I 120 S=S+1:IF S<=N THEN B(S)=Z:GOTO 60 130 END 140 L(1)=B(K(1))*2:RETURN 150 L(2)=B(K(2))*3:RETURN160 L(3)=B(K(3))*5:RETURN
К задачам
| | | | | |
ОТВЕТ 5.
Возможны следующие подходы к решению этой задачи. Во-первых, рассмотреть прямые, содержащие стороны треугольника.
Если данная точка находится по ту же сторону от прямой, что и третья вершина, и это выполняется одновременно для всех трех прямых, то она расположена внутри треугольника. Во-вторых, если соединить эту точку с вершинами треугольника, рассмотреть сумму площадей вновь образованных трех треугольников, и эта сумма равна площади исходного треугольника (разумеется, в пределах заданной точности), то заданная точка находится внутри треугольника. В предложенной ниже программе реализовантретий подход, основанный на том, что если рассмотреть сумму углов при вершине, образованной исследуемой точкой и вершинами
треугольника, и если эта сумма равна 360, то точка находится внутри треугольника.
10 REM ТРЕУГОЛЬНИК 20 DIM X(3),Y(3)
30 FOR I=1 TO 3 40 INPUT X(I),Y(I) 50 NEXT I
60 INPUT A,B70 S=Y(1)-B 80 T=X(1)-A 90 GOSUB 400 100 P=F 110 S=Y(3)-B 120 T=X(3)-A
130 GOSUB 400 140 F=P-Q 150 IF ABS(F)>=3.141593 THEN F=F-3.141593*2*SGN(F) 160 Z=F 170 FOR I=1 TO 2
180 S=Y(I)-B 190 T=X(I)-A 200 GOSUB 400
210 P=F 220 S=Y(I+1)-B 230 T=X(I+1)-A
240 GOSUB 400 250 Q=F260 D=P-Q 270 IF ABS(D)>=3.141593 THEN D=D-3.141593*2*SGN(D) 280 Z=Z+D 290 NEXT I 300 IF ABS(Z)<3.141593*2 THEN PRINT"ВНЕ"310 IF ABS(Z)>=3.141593*2 THEN PRINT"ВНУТРИ"
320 END400 IF S>0 AND T>0 THEN F=ATN(S/T)410 IF S>0 AND T<0 THEN F=ATN(S/T)+3.141593420 IF S<0 AND T>0 THEN F=ATN(S/T)+3.141593*2 430 IF S<0 AND T<0 THEN F=ATN(S/T)+3.141593
440 RETURN
К задачам
| | | | | |
ОТВЕТ 6. Задача сильно упростится, если мы не будем заранее исследовать, сколько соседних элементов есть у данной клетки. В этом случае программа будет иметь вид:
10 INPUT "ВВЕДИТЕ N КЛЕТКИ:";X 20 IF X<1 OR X>64 THEN PRINT "ОШИБКА":GOTO 1030 IF X+8<=64 THEN PRINT X+8
40 IF X-8>=1 THEN PRINT X-8 50 IF (X-1)/8<>INT((X-1)/8) THEN PRINT X-1 60 IF X/8<>INT(X/8) THEN PRINT X+1
К задачам
| | | | | |
|
|
|