Программа поиска дружественных чисел. Visual Basic

Создаем форму как на приведённом рисунке. Размещаем элементы:
List1 (Нулевую строчку заполняем заглавием: Дружественные числа)
Timer1 - для прерываний
Label1 - записка с пояснением (желтая)

Создаем в той же папке где программа файлы:
last.txt - будем сохранять последнее просчитанное число(напишем в него 1, сохраним и закроем).
Druj.txt - будем записывать пары дружественных чисел построчно.

Программа работает следующим образом:
Сначала в загрузке формы, открывает файл last.txt, забирает последнее просчитанное число.  Приcваивает его переменной Nt.
Затем прерывание и действия передаются таймеру. С шагов Sh = 17 таймер запускает
17 просчётов дружественных чисел и возвращает управление. После задержки снова запускается на следующий просчет в 17 проверяемых чисел(N).

Основной алгоритм: cbCount1():
Для каждого просчитываемого числа, находится сумма делителей нацело (накопительный S от 2 до корня из N). Для суммы делителей находится сумма ее делителей S2 (до корня из S). Если N (S) является квадратом, то делитель учитываем только один раз. 
Если N=S2, то найдена пара дружественных чисел. Записываем их в порядке возрастания (N < S) :

 If (N = S2) And (N < S) Then

Это позволяет не дублировать пары (и не сохранять дополнительную информацию), когда будет просчитываться большее число и найдется к нему пара – меньшее число.
Пара при соблюдении условия записывается в List1  и в файл.
Каждые 1000 просчитываемых чисел, пересохраняется last.exe. Также он пересохраняется при выходе из программы крестиком в Form_Terminate().

‘Код программы на Visual Basic 6.0.

Public Nt, Sh As Long
Public State As Long


Private Sub cbCount1()
For N = Nt To Nt + Sh
    Nt = N
    S = 1
    R = Int(Sqr(N))
    For i = 2 To R
        t = N Mod i
        If t = 0 Then S = S + i + (N \ i)
        If (t = 0) And (i = R) Then S = S - (N \ i)
    Next i
    R = Int(Sqr(S))
    S2 = 1
    For i = 2 To R
        t = S Mod i
        If t = 0 Then S2 = S2 + i + (S \ i)
        If (t = 0) And (i = R) Then S2 = S2 - (S \ i)
    Next i
    If N Mod 100 = 0 Then Form1.Refresh
    If (N = S2) And (N < S) Then
        List1.List(List1.ListCount) = Str(N) + ", " + Str(S)
        List1.Refresh
        Open CurDir + "\Druj.txt" For Append As #88
            StL = Trim(Trim(Str(N)) + " " + Trim(Str(S)))
            Print #88, StL
        Close (88)
    End If
    If N Mod 1000 = 0 Then
        Open CurDir + "\last.txt" For Output As #88
            Print #88, Trim(Str(Nt))
        Close (88)
    End If
Next N
Form1.Caption = "Дружественные числа: " + Str(Nt)
End Sub

Private Sub Form_Load()
Timer1.Interval = 1
State = 1
Sh = 17
Open CurDir + "\last.txt" For Input As #88
    Line Input #88, StL
    Nt = Val(Trim(StL))
Close (88)

End Sub

Private Sub Form_Terminate()
Open CurDir + "\last.txt" For Output As #88
    Print #88, Trim(Str(Nt))
Close (88)
End Sub

Private Sub Timer1_Timer()
Select Case State
    Case 1
        Call cbCount1
        State = 1
End Select
End Sub


Рецензии
Вот на фига такая странная задача - поиск дружественных чисел?
Я использую Визуал Бейсик для более интересных вещей ))
Кстати, Вы ещё посещаете этот сайт? Или ну его?

Однако упоминание о бейсике меня радует. На этом сайте хоть обсудить что хочешь спокойно можно, не в пример сайтам программистов - на них возни много, а толку чуть. Хотя кое-что я и на этих сайтах для себя почерпнул.

Чтобы комментарий скучным не казался -

. . . . Ода Турбо Бейсику

Забив на оператор GOTO, *
Все перешли на языки сложнее,
Чем Бейсик. Но по-прежнему милее
Мне он. Люблю его за простоту.

За численные строк обозначенья, **
Универсальность функции INKEY$, ***
За мысли постепенное теченье,
За все RETURN, которые там есть, ****

За длинный милый ряд волшебных звуков,
За амплитуды, полнящие файл,
За классику - всех Бахов и их внуков,
За всё, что я пока не записал.

За возвышенье творческих мотивов,
За любованье ритмикой танго.
За страсть любви, без всяких перерывов,
Достойную Поэта.

Одного достаточно, чтоб целый мир восславить.
Не важно - языком, или пером.
Как говорил Алмyстафа красавец, *****
С любовью этой, дай Бог, не умрём.
__________
* использование оператора GOTO считается дурным тоном в программировании
** строки текста программы на Бейсике могут нумероваться
*** функция INKEY$ возвращает код нажатой клавиши, а также отслеживает комбинации клавиш
**** RETURN возврат из подпрограммы
***** Алмyстафа - персонаж книги "Пророк"Д.Х.Джебрана
Турбо Бейсик я использовал, в частности, для озвучивания классической музыки
прослушать записи можно тут - http://yadi.sk/d/poMxlrBuxendv
сейчас перешёл на Визуал Бейсик.

С уважением и с радостью, что встретил любителя Бейсика. ))

Дмитрий Маштаков   29.08.2018 09:39     Заявить о нарушении