2021-10-19 C++奇怪数

缘由求:用c++求出1000以内的所有奇怪数-编程语言-CSDN问答
奇怪数为这样一个整数
①:除了自身以外所有因子之和大于这个数本身(首先必须是盈数)
②:除了自身以外所有因子的集合,没有任何一个子集中所有数的和等于这个数本身(数组的子集可以是单个以及2个以上连续的)

void 奇怪数()
{//缘由https://ask.csdn.net/questions/7536352?spm=1005.2025.3001.5141
	int 因子集[47]{0}, 数 = 10, 序 = 0, 和 = 0, 双 = 0, 算 = 0;
	bool 判 = true;
	while (数 <= 1000)
	{
		求因子集合(数, 因子集, &和, &序);
		sort(因子集, 因子集+序+1);//算法原则:连续子集集合累加累减,非连续子集用差寻找并从最大起搜寻
		//算 = 和;
		//while (双 <= 序)
		//{
		//	if (((和 -= 因子集[双]) == 数 || (算 -= 因子集[序 - 双]) == 数)&&(和>数&&算>数))判 = false;
		//	++双;
		//}
		if (和 > 数)
			判 = (子集数(数, 因子集, 序) > 0 ? true : false);
		else 判 = false;
		if (判)
			cout << 数 << ends;
		//双 = 0; while (++双 <= 序)因子集[双] = 0;
		数 += 2; 判 = true; 序 = 和 = 双 = 算 = 0;
	}
}
void 求因子集合(int 数, int* 数组, int* 和, int* 序)
{
	int 求 = 1, 商 = 0;//因子不含数本身但包含1
	*和 = 数组[0] = 求;
	while (++求 <= (商 = 数 / 求))
		if (!(数 % 求))
		{
			*和 += 数组[++*序] = 求;
			if (求 != 商)
				*和 += 数组[++*序] = 商;
		}
}
int 子集数(int 数, int* 数组, int 序)
{
	int x = 0;
	while (x <= 序)
	{
		if (数组[序 - x] <= 数)
			数 -= 数组[序 - x];
		++x;
	}
	return 数;
}

int 子集数(int 数, int* 数组, int 序)
{
	int x = -1;
	while (++x <= 序 && 数)
	if (数组[序 - x] <= 数)
		数 -= 数组[序 - x];
	return 数;
}

2021-10-19 C++奇怪数_第1张图片

2021-10-19 C++奇怪数_第2张图片

你可能感兴趣的:(c语言,算法,经验分享,笔记,c++)