题解 | #完全数计算#
完全数计算
https://www.nowcoder.com/practice/7299c12e6abb437c87ad3e712383ff84
这题的关键是对于完全数的判断,减少不必要的计算:
- 判断整数n是不是完全数的时候,当i能被n整除,n/i也能被n整除,相当于一次性得到两个约数,那么在判断出i是约数的时候可以在约数和sum里面同时加上i和n/i;
- 设置循环的上限max,当判断到i是约数的时候,那么比n/i大的数在前面判断中已经有结论,可以将上限设为n/i。
#include<bits/stdc++.h> using namespace std; bool isComplete(int n) { int sum=1; int max = n; for (int i = 2; i < max; i++) { if (n%i == 0) { sum += i; if (i != n / i) { sum += n / i; } max = n / i; } } if (sum == n) { return true; } return false; } int main() { int n; cin >> n; int count = 0; if (n==1||n==2) { cout << 0; } else { for (int i = 3; i < n; i++) { if (isComplete(i)) { count++; } } cout << count; } return 0; }