Problem Setting:
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99.
Find the largest palindrome made from the product of two 3-digit numbers.
1 determine the range of numbers of the product of two 3-digit numbers. easy
2 search for the largest palindromic number from it.
Since we have to manipulate each digit of the number, it is better to store each digit in one block of an vector. So
we dissect task 2 into following:
S1 read in a number in range
S2 disect them into digits and store them in vector
S3 check if a certain number is a palindrome
vector<int> intoDigits(int n){
int target=n,digit=0;
vector<int> result;
while(target>0){
digit=target%10;
target=(target-digit)/10;
result.push_back(digit);
}
return result;
}
/* half digits from beginning equal to half from the end*/
bool isPalindrome(vector<int> n){
vector<int>::size_type half_size=n.size()/2;
vector<int>::size_type size=n.size();
for(vector<int>::size_type i=0;i<half_size;i++){
if(n[i]!=n[size-1-i]) {
cout<<"no";
return false;
}
}
cout<<"yes";
return true;
}
Now wirte codes to iterate every number in the range from high to low and get the first number which is palindormic
int main() {
//clock_t startTime = clock();
const int lower_boundary=100*100;
const int upper_boundary=999*999;
for(int i=upper_boundary;i>=lower_boundary;i--){
if(isPalindrome(intoDigits(i))){
cout<<"the largest palindrome in range is: "<< i;
break;
}
}
//cout << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds." << endl;
return 0;
}
The result is 997799
Test as incorrect! How can that be?
Because 997799 can not be factored into the product of two 2-digits number.
So have to find other way to iterate.
S1 initialize two factors, f1 and f2
S2 there is two way to get a product a little bit smaller than f1*f2
1 (f1-1)*f2
2 f1*(f2-1)
calculate both of them and choose the greater one
S2 do until lower boundary
int main() {
//clock_t startTime = clock();
int f1=999,f2=999;
for(int i=f1*f2;f1>100||f2>100;){
if(isPalindrome(intoDigits(i))){
cout<<"the largest palindrome in range is: "<< i;
break;
}//find the next number which the product of two 3-digit numbers
else{
if(f1>=f2){
f1-=1;
}else{
f2-=1;
}
i=f1*f2;
//cout<<i<<" ";
}//else
}//for
//cout << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds." << endl;
return 0;
}
get the result 698896 still wrong!
After verified the result is palindrome and a product of two 3-digit numbers 836,836
But it is not the greatest! We still counted number in a wrong way with missing come combinations.
Here is algo to find combinations arranging in a descending order.
S1 two number a,b and a_boundary,b_boundary, iterate all the combination of product of them
S2 define a number N
S3 search in area of a~a-N and b~b-N, if found, end, if not S4
S4 if a=a-N,b=b-N don't reach boundary contunue S3;else search in area a~a_boundary,b~b_boundary end
come to solution 906609 correct. But the method used is really ugly. There is more concise way to do such thing.