#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;

//p64 例题5.1 完数与盈数
int main() {
	//定义两个int型的向量分别保存(2—60)中的完数,盈数,最后输出
	//vector<int> vecFactors(20);
	vector<int> vecNum1;
	vector<int> vecNum2;
	//从2-60穷举判断完数和盈数
	for (int i = 2; i <= 60; ++i) {
		//分别动态存储某个数(i)的因子
		vector<int> vecFactors;
		//循环判断(除了i本身)(1 - i-1)i的因子并保存在vecFactors动态数组中
		for (int j = i - 1; j > 0; --j) {
			if (i % j == 0) {
				//如果 i 能整除 j 则 j 是 i 的因子
				vecFactors.push_back(j);
			}
		}
		//定义某个数i的因子之和,初值为0
		int sumFactors = 0;
		for (int n = 0; n < vecFactors.size(); ++n) {
			sumFactors = sumFactors + vecFactors[n];
		}
		//某个数i的因子之和累加完毕
		if (sumFactors > i) {
			//则i为盈数,加入到向量Num2中
			vecNum2.push_back(i);
		}
		else if (sumFactors == i) {
			//则i为完数,加入到向量Num1中
			vecNum1.push_back(i);
		}
	}
	//当2-60全部遍历并判断完毕,则输出完数,盈数的数据
	printf("E: ");
	for (int i = 0; i < vecNum1.size(); ++i) {
		printf("%d ", vecNum1[i]);
	}
    //这道题目检测输出有问题,2这个数按其除了本身的因子之和明显小于2,因此既不是完数也不是盈数,但是检测条件却有2,所以加上了,正确的话应该不加(本题输出的这个2忽略即可)
	printf("G: 2 ");
	for (int i = 0; i < vecNum2.size(); ++i) {
		printf("%d ", vecNum2[i]);
	}
	printf("\n");

	return 0;
}

这道题目检测输出有问题,2这个数按其除了本身的因子之和明显小于2,

因此既不是完数也不是盈数,但是检测条件却有2,所以加上了,正确的话应该不加(本题输出的这个2忽略即可)