疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java编程实现简单算法


 

   

  问题描述:将1,2,3,4,5,6,7,8,9共9个数分成三组,组成3个三位数,且使这3个三位数构成1:2:3的比例,例如:3个三位数192,384,576满足以上条件.192:384:576=1:2:3。试求出所有满足条件的3个三位数。

  解题思路:最小三位数为123,最大三位数为987,则987/3=329,所以枚举范围123~329。网上有网友提出新思路,本人觉得非常好。其思路为其实要判断这三个数是否由1~9组成且各个数组不相同,即这三个数的各位数是否覆盖了1~9,只要判断各位数字的积是否等于9!且各位数字的和是否等于45。较以往的方法有很大的进步性,本人采用java讲该位网友的新方法写了一遍,欢迎建议和意见。具体代码如下。

  /**

  *

  * 功能:将1,2,3,4,5,6,7,8,9共9个数分成三组,

  * 组成3个三位数,且使这3个三位数构成1:2:3的比例,

  * 例如:3个三位数192,384,576满足以上条件.

  * 192:384:576=1:2:3。试求出所有满足条件的3个三位数

  *

  */

  public class OneTwoThree {

  //构造函数

  public OneTwoThree(){

  }

  //求num上每位上数的和

  public int getSum(int num){

  int singleDigit = num % 10;

  int tensDigit = num / 10 % 10;

  int hundredDigit = num /100;

  int sum = singleDigit + tensDigit + hundredDigit;

  return sum;

  }

  //求num每位上的数的积

  public int getMul(int num){

  int singleDigit = num % 10;

  int tensDigit = num / 10 % 10;

  int hundredDigit = num /100;

  int sum = singleDigit * tensDigit * hundredDigit;

  return sum;

  }

  //是否满足要求

  //网上有网友提出方法,只要判断各位数字的积是否等于9!且各位数字的和是否等于45。

  public boolean isRight(int num1){

  if ((getSum(num1) + getSum(num1 * 2) + getSum(num1 * 3) == 45) &&

  getMul(num1)*getMul(num1 * 2)*getMul(num1 * 3) == 9*8*7*6*5*4*3*2) {

  return true;

  }

  return false;

  }

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  OneTwoThree ott = new OneTwoThree();

  /*

  * 1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,

  最小的那个数应该不到于987/3=329。这样的话第一个数的变化范围是123~329

  */

  for (int i = 123; i < 329; i++) {

  if(ott.isRight(i)){

  //把每个满足要求的数打印出来

  System.out.println(i + " " + (2*i) + " " + (3*i));

  }

  }

  }

  }

  控制台输出如下:

  192 384 576

  219 438 657

  273 546 819

  327 654 981