Problem4

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.


My thinking comes in this way:

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.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值