void 一个数因子和(int 整数)
{//缘由https://ask.csdn.net/questions/1054457#answer_1251715
int he = 0, j = 0; string a = "";
while (++j < 整数)if (!(整数%j))he += j, a += to_string(j) + "+";
cout << a << "的因子和:" << he << endl;
}
int a = 0; cout << "输入一个整数:"; cin >> a; 一个数因子和(a);
还真是不比贴主的快,引起我认真审题,修改一下,比贴主更快。循环到整数的二分之一速度快,但是求二分之一要放到循环外预先计算。还可以继续优化到更快。
void 一个数因子和(int 整数 = 44)
{//缘由https://ask.csdn.net/questions/1054457#answer_1251715
int he = 0, j = 1, jj = 整数 / 2; string a = "";
while (j < jj)if (!(整数%j))he += j, a += to_string(j) + "+", ++j; else ++j;
cout << 整数 << "=>" << a << "的因子和:" << he << endl;
}
一个数的因子集合是能被整除的除数与商数的集合。
void 快速数因子和(int& jj, int 整数 = 447744774)
{//一个数的因子集合是能被整除的除数与商数的集合。缘由https://ask.csdn.net/questions/1054457#answer_1251715
unsigned long int 和 = 0, 除数 = 1, 商数 = 整数, 开方 = sqrt(整数); string 观察 = "";
while (++除数 < 商数 && 除数 <= 开方)
if (!(整数 % 除数))
{
和 += 除数 + (商数 = 整数 / 除数),
观察 += to_string(除数) + "+",
观察 += to_string(商数) + "+";
if (除数 + 除数 >= 商数){ ++jj; 观察 += "☆"; break; }
}
cout << 整数 << "=>" << 观察 << "的因子和:" << (和 += 1) <<ends<<jj<< endl;//if (和 == 整数)
}
int aa = INT_MAX - 1, j = 1111111, 起始 = 44, 结束11 = 1111799, jj = 0;
while ((j += 2) < 结束11)if (j >= 起始&&判断素数(j))cout << j << ends;
while (j++ < 结束11)快速数因子和(jj,j);
快速数因子和(jj, aa);
完美数的确用开方作为结束比较快,优化的地方我没错,问题出在结束用商,对于某些数是不适合的,这一点也注意到了,尤其是遇到质素时,正好这个做了个验证。很多数用商是比较接近开方的。
//int 整数 = 9999;
//while (--整数)
//{
// int 和 = 1, 除数 = 1, 商数 = 整数, 开方 = sqrt(整数);
// while (++除数 <= 开方){if (!(整数 % 除数))和 += 除数 + (整数 / 除数);if (除数 + 除数 >= 商数)break;/*虽然这个判断只有20%命中率也算是个小优化可减少循环次数*/}
// if (和 == 整数)cout << 整数 << ends;//
//}