Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 33


Совет 3 (общий)

Попробуйте модифицировать программу таким образом, чтобы обнаружить все числовые последовательности, образующие цикл с самого первого шага. В качестве примера приведем некоторые из них:

1 —> 1 (одношаговый цикл),

136 -> 244 —> -136 (двухшаговый цикл),

55 -> 250 -> 133 -> (трехшаговый цикл).

Программа 2_19.bas

RЕМ Поиск циклов при суммировании кубов цифр

DECLARE FUNCTION nkub& (N&)

DIM MASS(100) : ' Массив для последовательности чисел

CLS

INPUT "Введите число - ", N&

К=0: MAS&(0)=N& ml: К=К+1 : ' Счетчик числа шагов

MASS(K)=nkub&(MASS(K-l))

PRINT "Шаг =";К," N =";MAS&(K)

FOR 1=0 ТО К-1 : ' Поиск совпадения с предыдущими числами

IF MAS&(I)=MASS(K) THEN GOTO m2

NEXT I

GOTO ml m2: PRINT "Обнаружен цикл": PRINT "Начало цикла шаг ";1

PRINT "Конец цикла шаг ";К-1

END

FUNCTION nkub&(N&)

КЕМ Преобразование числа в сумму кубов его цифр

DIM S AS INTEGER, M AS LONG S=0: M=N& WHILE M<>0

D=M MOD 10: M=(M-D)/10 : ' Выделение очередной цифры

S=S+D*D*D : ' Накопление суммы кубов

WEND nkub&=S

END FUNCTION

Программа 2_19.c

/* Поиск циклов при суммировании кубов цифр */

#include <stdio.h>

#include <conio.h>

long n_kub(long N);

long N;

int i=l,Q[6562];

main ()

{

clrscr();

printf("\nВведите число ");

scanf("%ld",&N); Q[N-l]=i; ml:

printf ("\n Шaг=%2d N=%ld", i,N) ;

N=n_kub(N);

if(Q[N-1]!=0) /* He было ли раньше такого же числа ?*/ {

printf("\nHa %d шаге обнаружен цикл N=%ld",i+l,N);

getch ();

exit(0) ;

}

Q[N-l]=i++; /* Фиксация очередного числа в массиве Q*/

goto ml;

}

/ *-------------------------------------* /

long n_kub(long N)

{

/* Преобразование числа в сумму кубов его цифр */

int k;

long s=0; while (N)

{

k=N%10;

N=N/10; /* Выделение очередной цифры */

s+=k*k*k; /* Накопление суммы кубов */




- Начало -  - Назад -  - Вперед -