2021-10-19 C++奇怪数

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

void 奇怪数()
{//缘由https://ask.youkuaiyun.com/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 数;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值