#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; }
} */