上次我解释了第一道面试题。现在再来看看第三道。
有一种数字,正过来和倒过来读是一样的,如123454321,99877899。我不知道中文叫什么,战且称之为回文数字。现给定一个数值,求小于此数值的最大回文数字,并能被30之内的素数整除。
我的分析如下。
要求最大的回文数字,要把数字分一半,前一半减一,在把倒过来加上。如
10000的最大的回文数字是9999,下一个是9889,在下一个是9779 ....
100000的最大的回文数字是99999,下一个是99899,在下一个是99799 ....
30之内的素数是2 3 5 7 11 13 17 19 23 29. 为了简化,我下面就用了2 3来做测试.
这个数字其实是非常大的。为了简化,我就用了int的类型。
这是我个人的想法,未必对。只是参考。
========================================================================
private int CalculateNumber ( int piNumber ) {
int liResult = piNumber ;
while ( liResult != 0 ) {
liResult = GetMaxNumber ( liResult );
if ( dividePrimNumber ( liResult ) ) {
break;
}
}
return liResult;
}
private Boolean dividePrimNumber( int piNumber ) {
return ( piNumber % 2 == 0
&& piNumber % 3 == 0
//&& piNumber % 5 == 0
//&& piNumber % 7 == 0
//&& piNumber % 11 == 0
//&& piNumber % 13 == 0
//&& piNumber % 17 == 0
//&& piNumber % 19 == 0
//&& piNumber % 23 == 0
//&& piNumber % 29 == 0
);
}
private int GetMaxNumber ( int piNumber ) {
String lsFullNumber = piNumber.ToString ();
String lsFirstHalf;
String lsLastHalf;
int liNumLength = lsFullNumber.Length;
int liFirstHalfLength = liNumLength / 2 + liNumLength % 2;
int liReverseLenght = liNumLength / 2;
lsFirstHalf = lsFullNumber.Substring ( 0, liFirstHalfLength ); // get first half of number
lsFirstHalf = ( int.Parse ( lsFirstHalf ) - 1 ).ToString (); // minus one
lsLastHalf = lsFirstHalf.Substring ( 0, ( lsFirstHalf.Length > liReverseLenght ? liReverseLenght : lsFirstHalf.Length ) );
lsLastHalf = new String ( lsLastHalf.ToArray ().Reverse ().ToArray () ); // reverse the first half of number
return int.Parse ( lsFirstHalf + lsLastHalf );
}
=========================================================================================
这不是算法题,这是一道.net的编程题目。