Другие языки программирования и технологии

Очень сложная задача, прошу помощи знающих

С++ -как и практически любой другой язык с С-подобным синтаксисом - принципиально не годится для доказательства правильности: все эти языки целиком построены на побочных эффектах.

Хочешь доказывать правильность императивного кода - бери Pascal (классический виртовский, а не Delphi или ABC.Net), Modula-2, CLU, Ada, Oberon...

Сам же алгоритм тривиален (в данном случае число вводится в десятичной записи, но обрабатывается как пятеричное - суть алгоритма от этого не меняется):

cin >> x;
mask = 1; // маска для выделения правой части числа
flg = false; // Флаг "совершенное число"
// Цикл по правым частям числа (1 цифра, 2 цифры, ..n цифр)
while (x / mask != 0 && !flg) {
// Получаем очередную правую часть числа
mask *= 5;
cur = x % mask;
// Считаем сумму множителей текущей правой части
sum = 0;
for(i = 1; i < cur; ++i) { if (cur % i == 0) { sum += i; } }
// Проверяем на совершенность
flg = sum == x;
}
cout << (flg? "да" : "нет");

P.S. Дело не в моде, а в том, что доказательство правильности резко увеличивает стоимость разработки (в том числе и тем, что требует иного, чем бездумное применение паттернов, уровня образования). Потому имеет смысл только для критически важных вещей.
Геннадий Роговцов
Геннадий Роговцов
67 662
Лучший ответ
Не. Это лет 20 назад было модно. Сейчас мода другая
Kamran Tagizade
Kamran Tagizade
88 004