缘由求:用c++求出1000以内的所有奇怪数-编程语言-CSDN问答
奇怪数为这样一个整数
①:除了自身以外所有因子之和大于这个数本身(首先必须是盈数)
②:除了自身以外所有因子的集合,没有任何一个子集中所有数的和等于这个数本身(数组的子集可以是单个以及2个以上连续的)
void 奇怪数()
{//缘由https://ask.csdn.net/questions/7536352?spm=1005.2025.3001.5141int 因子集[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 数;
}