缘由求:用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 数;
}