第三道面试题

上次我解释了第一道面试题。现在再来看看第三道。

有一种数字,正过来和倒过来读是一样的,如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的编程题目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值