#include <iostream> using std::cout; using std::endl; typedef unsigned int uint32; const uint32 MIN = 99; const uint32 MAX = 999; uint32 revers_num(uint32 k) { uint32 rk = 0; while( k ) { rk = 10 * rk + k % 10; k /= 10; } //cout << "k=" << k << ", rk=" << rk << endl; return rk; } bool is_3digit_num( uint32 n) { bool ret = false; for(uint32 i = MAX; i != MIN; --i ) { int t = n / i; if ( t * i == n && t > MIN && t <= MAX ) { cout << "t=" << t << ", i=" << i << endl; ret = true; break; } } return ret; } uint32 resolveP4() { uint32 result = 0; for( uint32 j = MAX; j != MIN; --j ) { uint32 reverse = revers_num( j ); uint32 n = j * (MAX + 1) + reverse; if ( is_3digit_num ( n ) ) { result = n; break; } } return result; } int main() { //uint32 result = revers_num(800); uint32 result = resolveP4(); cout << "result = " << result << endl; return 0; } /*当我解决之后,发现了一个论坛上有人分享了一个更好的解决方法: The palindrome "abccba" can be written as 11(9091a + 910b + 100c) = mn; a,b & c being 1 digit integers and m & n being 3 digit intergers. Let 11 * 10 < m < 11 * 90; for(int a=9; a>=1; a--) for(int b=9; b>=0; b--) for(int c=9; c>=0; c--){ num = 9091 * a + 910 * b + 100 * c; for(int divider=90; divider>=10; divider--){ //look for divider that can divide //and also doesn't make n > 999 if((num % divider) == 0){ if((num / divider) > 999) break; else result = num * 11; //Found it! } else { break; } } */
http://projecteuler.net/problem=4 【参考解法】
最新推荐文章于 2022-02-25 21:57:21 发布