/* Problem 95 —— Find the smallest member of the longest amicable chain with no element exceeding one million. The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number. Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. Perhaps less well known are longer chains. For example, starting with 12496, we form a chain of five numbers: 12496 14288 15472 14536 14264 ( 12496 ...) Since this chain returns to its starting point, it is called an amicable chain. Find the smallest member of the longest amicable chain with no element exceeding one million. —————————————————————————————————————————————————————————————————————————————————————————————————————— Problem 95 ある数の真の約数とは, それ自身を除く約数すべてである. 例えば, 28 の真の約数は 1, 2, 4, 7, 14 である。これらの約数の和は 28 に等しいため, これを完全数と呼ぶ. 面白いことに, 220 の真の約数の和は 284 で, 284 の真の約数の和は 220 となっており, 二つの数が鎖をなしている. このため, 220 と 284 は友愛数と呼ばれる. さらに長い鎖はあまり知られていないだろう. 例えば, 12496 から始めると, 5 つの数の鎖をなす. 12496 → 14288 → 15472 → 14536 → 14264 (→ 12496 → ...) この鎖は出発点に戻っているため, 友愛鎖と呼ばれる. いずれの要素も 1,000,000 を超えない最長の友愛鎖の最小のメンバーを求めよ. */ #include <Windows.h> #include <iostream> using namespace std; //int GetProperDivisors(int n) //{ // int sum = 0; // for (int i=n-1; i>=1; --i) // { // if (n%i==0) // { // sum += i; // } // } // return sum; //} int GetDivisorSum(int n) { } int main() { DWORD st = ::GetTickCount(); const int N = 101; int number[N]; for (int i=0; i<N; ++i) { number[i] = GetProperDivisors(i); } DWORD ft = ::GetTickCount(); cout << "run time " << ft-st; return 1; } //数论__求一个数所有约数之和 // //比如: //2004的约数之和为:1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 ,2004 = 4704 // //如何求一个数所有约数之和呢? //首先,应用算术基本定理,化简为素数方幂的乘积。 // //X = a1^k1 * a2^k2........an^kn // //X的所有素数之和可用公式(1+a1 + a1^2...a1^k1) * (1+a2 + a2^2...a2^k2) * .....(1+an + an^2...an^kn)表示 // //如: //2004 = 2^2 * 3 *167 // //2004所有因子之和为(1 + 2 + 2^2) * (1 + 3) * ( 1 + 167) = 4704; // //程序实现的时候,可利用等比数列快速求1 + a1 + a1^2 + .....a1^n;