Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаФИН kosh.doc
Скачиваний:
29
Добавлен:
15.02.2016
Размер:
3.16 Mб
Скачать

Пример 1 Приложение, которое находит дружественные числа на заданном отрезке

"Дружественными" называются числа, каждое из кото­рых равно сумме всех нату­ральных делителей дру­гого, исключая само другое число, напри­мер, такими числами являются 220 и 284.

Создайте диалоговое при­ло­жение и спро­ек­ти­руй­те окно как показано на ри­сун­ке.

Свяжите с окнами ре­дак­тирования пе­ре­менные long a и long b, а со списком -объект CListBox list.

Добавьте функцию для кнопки OK, которая будет проверять все числа на от­резке [a, b] с помощью вспо­могательной функции.

Добавьте вспо­мога­тель­ную функцию long SumDel (long n) в класс С…Dlg. Эта функция будет находить сумму делителей числа n.

Добавьте в функии код, показанный ниже.

// Функция, которая обрабатывает нажатие кнопки OK:

void CDrugNumbersDlg::OnBnClickedOk()

{

UpdateData();

long j;

CString str;

list.ResetContent(); // Очищаем список

// Нам нужно найти два числа

for (int i = a; i<=b; ++i) // берем очередное число на отрезке [a, b]

{

j = SumDel(i); // и число, которое равно сумме делителей первого

if (i==SumDel(j) && j>i && j <= b)

/* если первое число равно сумме делителей второго и второе число больше первого и лежит на отрезке [a, b], то числа i и j удовлетворяют условию и их нужно вывести с помощью списка*/

{

str.Format(" %i и %i", i, j);// делаем из чисел строку

list.AddString(str); // и добавляем ее в список

}

} // здесь заканчивается цикл for

if (list.GetCount() == 0)

// если в списке нет ничего, выводим сообщение:

list.AddString("Нет дружественных чисел");

list.AddString("в этом диапазоне");

}

// Вспомогательная функция, которая находит сумму делителей заданного числа

long CDrugNumbersDlg::SumDel(long n)

{

long s = 0; // переменная, с помощью которой мы находим сумму делителей

for (int d = 1; d <= n/2; ++d) // проверяем все возможные делители d

if (n % d == 0) s += d; // если n делится на d, добавляем d к сумме

return s;

}

Постройте исполняемый файл и запустите приложение. Не стоит за­да­вать диапазон длиной более 100 000. Программа будет работать слишком долго.

Пример 2 Программа, которая находит заданное количество чисел, которые равны сумме квадратов двух натуральных чисел

Создайте диалоговое при­ло­жение и спро­ек­ти­руй­те окно как показано на ри­сун­ке.

Свяжите с окном ре­дак­тирования пе­ре­менную int kol, а со списком – объ­ект CListBox list.

Добавьте функцию для кнопки “Найти”, она будет с помощью вспомогатель­ной функции проверять все подряд нату­ральные числа, пока не найдет за­дан­ного количества нужных чисел.

Добавьте вспо­мога­тель­ную функцию BOOL Equal(int n, int& a, int& b) в класс С…Dlg. Эта функция будет проверять, существуют ли числа a и b, та­кие что n = a2 + b2 .

Добавьте в функии код, показанный ниже.

void CSumKvadDlg::OnButton1() //

{

UpdateData();

int k = 0; //

int i = 0; //

CString str; //

int a, b; //

m_list.ResetContent();//

while (k < kol) //

{

i++; //

if (i==2000000) //

{

m_list.AddString("Поиск закончен");

break;

}

if (Equal(i, a, b)) //

{

str.Format(" %i = %i * %i + %i * %i",i, a, a,b, b);

m_list.AddString(str); //

k++; //

}

}

}

//

BOOL CSumKvadDlg::Equal(int n, int& a, int& b)

{

BOOL flag = false; //

for (a = 1; a< sqrt(double(n)); a++)//

{

b = int(sqrt(double(n - a*a))); //

if (n == a*a + b*b) //

{

flag = true;

break;

}

}

return flag;

}