`
zhou_zhihao
  • 浏览: 55694 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

问题4-求两个三位数乘积的最大回文数

J# 
阅读更多

问题描述如下:

回文数从两边读值是一样的。两个两位数乘积的最大回文数是9009=99*99,求两个三位数乘积的最大回文数?

 

那么我们很快就可以得到实现代码,如下:

 

	private static Long getPalindromicNumber() {
		Long max = 0L;
		for (Long i = 100L; i <= 999; i++) {
			for (Long j = 100L; j <= 999; j++) {
				if (isPalindromicNumber(i * j)) {
					if (i * j > max) {
						max = i * j;
					}
				}
			}
		}
		return max;
	}

	private static boolean isPalindromicNumber(Long n) {
		StringBuffer s = new StringBuffer(n + "");
		s.reverse();
		return Long.parseLong(s.toString()) == n;

	}

 

  可以得到结果906609。

 

那么还有地方可以优化么?

如果循环从999开始到100,那么就可以更早的获得最大的回文数而不用因为三位数小而去改变max。

 

	private static Long getPalindromicNumber() {
		Long max = 0L;
		for (Long i = 999L; i >= 100; i--) {
			for (Long j = 999L; j >= 100; j--) {
				if (isPalindromicNumber(i * j)) {
					if (i * j > max) {
						max = i * j;
					}
				}
			}
		}
		return max;
	}

  我们再去观察,如果某个回文数888888=924*962,那么也有可能是962*924,两次获得某个回文数,如果判断j>i,应该可以回避此问题,减少将近一半的数值计算。

 

	private static Long getPalindromicNumber() {
		Long max = 0L;
		for (Long i = 999L; i >= 100; i--) {
			for (Long j = 999L; j >= i; j--) {
				if (isPalindromicNumber(i * j)) {
					if (i * j > max) {
						max = i * j;
					}
				}
			}
		}
		return max;
	}

 

 

end,请不吝赐教!

@anthor ClumsyBird

 

分享到:
评论
1 楼 alzc2012 2015-05-09  
     int num,max=0;
     int step=100,endPos=999;
        while (max==0) {
            if (max==0) endPos-=step;
            for (int i = 999; i > endPos; i--) {
                for (int j = 999; j >= i; j--) {
                    num = i * j;
                    if (isPalindrome(num) && max < num) max = num;
                }
            }
        }
       
循环终止位可以更改,毕竟最大的话趋势上是大数乘大数,按100的步长划分为多个部分,后面的部分几乎不可能出现最大回文数.

欢迎提出建议.

相关推荐

Global site tag (gtag.js) - Google Analytics