洛谷三连击---Java解法

题目:将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1 : 2 : 3 的比例,试求出所有满足条件的 3个三位数。
这一题作为洛谷的经典例题,有着许多的解法。这里笔者将说出自己看到的或想到的一些想法。
解这道题的大致方法就是先创建三个数,让这三个数成比例,再分离,看9个数是否相同。这里的不同解法就出现在判断这9个数是否相等。

解法一:(个人觉得是一种比较普遍,也比较快的解法)

public class Main {public static void main(String[] args){int a, b, c,i,j=0;                        int[] s=new int[9];            for (a = 100; a < 333; a++)           {b = 2 * a;c = 3 * a;     //让三个数成比例   s[0] = a / 100; s[1] = a % 100 / 10; s[2] = a % 10;  //分离每一位数,并用数组接受s[3] = b / 100; s[4] = b % 100 / 10; s[5] = b % 10;s[6] = c / 100; s[7] = c % 100 / 10; s[8] = c % 10;for (i = 0; i < 8; i++)         {for (j = i + 1; j < 9; j++)if (s[i] == s[j]||s[i]==0||s[j]==0)break;//判断元素是否相等    if (j < 9) break;}if (i == 8 && j == 9)          System. out. println(a+" " +b+ " "+c);}}
}

解法二:(认可度最高的解法)

public class Main {public static void main(String[] args) {int a, b, c;int[] s = new int[9];for (a = 100; a < 333; a++) {b = 2 * a;c = 3 * a;s[0] = a / 100;s[1] = a % 100 / 10;s[2] = a % 10;s[3] = b / 100;s[4] = b % 100 / 10;s[5] = b % 10;s[6] = c / 100;s[7] = c % 100 / 10;s[8] = c % 10;int n=1, q=0;for (int k = 0; k <s.length ; k++) {n=n*s[k];q=q+s[k];}if (n==1*2*3*4*5*6*7*8*9&&q==1+2+3+4+5+6+7+8+9)//这里通过两个条件限定这九个数System.out.println(a+" "+b+" "+c);}}

注意:这里是两个方程解九个未知数,答案肯定不唯一。但是这样写的原因就是数的范围被限定了。在该范围内只有一解,而这种方法只适合解这一道题,理论上是不严谨的。这种思想在日常的开发过程中用的很多,只专注与某个方法的实现,单单就一个问题而言。因为开发一个完整没有理论错误的程序是很难的。

解法三与解法四的差距不是特别大,并且由于HashSet的链表结构导致查询慢,所以三四方法的内存与时间会比一二方法多上一点。
解法三:利用HashSet集合不能存储相同的元素来判断数字是否相等(注意0这个元素),将满足!set.contains(0)&&set.size()==9的三组数输出即可。

import java.util.HashSet;public class Main {public static void main(String[] args){int a;HashSet<Integer> set=new HashSet<>();for (a = 123; a <=329 ; a++) {set.add(a/100);set.add(a%100/10);set.add(a%10);set.add(2*a/100);set.add(2*a%100/10);set.add(2*a%10);set.add(3*a/100);set.add(3*a%100/10);set.add(3*a%10);if (!set.contains(0)&&set.size()==9){System.out.println(a+" "+2*a+" "+3*a);set.clear();}set.clear();}}
}

解法四:(第四种方法把0的判断提到了之前)

import java.util.Set;public class Main {public static void main(String[] args) {int a;HashSe<Integer> set=new HashSet<>();for (a = 123; a <=329 ; a++) {if(a%100/10==0||a%10==0||2*a%100/10==0||2*a%10==0||3*a%100/10==0||3*a%10==0) continue;set.add(a/100);set.add(a%100/10);set.add(a%10);set.add(2*a/100);set.add(2*a%100/10);set.add(2*a%10);set.add(3*a/100);set.add(3*a%100/10);set.add(3*a%10);if (set.size()==9){System.out.println(a+" "+2*a+" "+3*a);set.clear();}set.clear();}}
}

运行结果:

将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1 : 2 : 3 的比例,试求出所有满足条件的 3个三位数---Java解法相关推荐

  1. 编程序求出满足如下条件的四位正整数个数:个位数字与百位数字的和是十位数字与千位数字之和的两倍。

    编程序求出满足如下条件的四位正整数个数:个位数字与百位数字的和是十位数字与千位数字之和的两倍. 代码如下: #include<stdio.h>int main() {int n;int a ...

  2. 把1,2,3,4,5,6,7,8,9九个数分成三组,各个数字使用一次

    前几天找工作,笔试下面这道题: 把1,2,3,4,5,6,7,8,9共九个数分成三组构成排列a1a2a3,a4a5a6,a7a8a9,而且每个数字使用有且仅有一次,构成的排列之比为3:2:1,求输出所 ...

  3. (转)《重庆女性特质调查报告》出炉 漂亮能干泼辣排前三

    (转)<重庆女性特质调查报告>出炉 漂亮能干泼辣排前三 2009年10月22日 [b]<重庆女性特质调查报告>出炉 漂亮能干泼辣排前三[/b] 什么样的词语最适合表现重庆女性的 ...

  4. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

  5. 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2

    已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...

  6. 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序

    已知数据文件IN14.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中.请编制一个函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此 ...

  7. 求4个数字组成的不重复三位数,Python简洁解法

    求4个数字组成的不重复三位数,Python解法 题目要求: 求所有由5,6,7,8组成的数字不重复的三位数 不重复的三位数,即不能出现555,566这种 通过分析,可以使用画树的方法来确定要求的三位数 ...

  8. 京东笔试——神奇数 【题目描述】东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和 等于另一组数字的和,我们就将这个数称为神奇数。例如 242 就是一个神奇数,我们能够

    2 .神奇数 [ 题目描述]东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和 等于另一组数字的和,我们就将这个数称为神奇数.例如 242 就是一个神奇数,我们能够将这 ...

  9. java实现809*两位数=800*两位数+9*两位数,求出两位数的值。其中8*两位数的结果为两位数,9*两位数的结果为三位数

    java实现809*??=800*??+9*??,求出??的值.其中??代表的是两位数,8*??的结果为两位数,9*??的结果为三位数 1 分析 1.1 此题需要控制台进行输入吗? 解答:不需要 1. ...

最新文章

  1. 使用Python,OpenCV实现简单的场景边界/拍摄转换检测器
  2. opboot怎么刷入固件_没有固件可刷的路由器,那就开个 SSH 折腾一下
  3. 简单识别 RESTful 接口
  4. 程序员,都是内卷之王!
  5. 【转载】一文读懂MCMC算法原理
  6. python脚本编程手册安卓版_python编程入门app下载
  7. ZSP12项目的总结
  8. 单片机pwm控制基本原理详解
  9. OFFICE激活报错0X80080005
  10. ADSL共享上网(简单方法)
  11. Vue高频面试问题(含答案),面试官直呼好家伙~
  12. 易宝典——玩转O365中的EXO服务 之五十 如何知道微软管理员进行了哪些操作
  13. Python爬虫——爬取博物馆新闻 + 情感倾向分析 + 导入数据库
  14. js 里奇数的判断条件
  15. MYSQL操作数据库-------查看、删除数据库
  16. 高亮显示用户键盘输入(kbd)
  17. 计算机无法连接网络显示错误651,电脑连接路由器提示错误651解决办法
  18. bucket list 函数解析
  19. 基于单片机的心率体温血压系统设计(#0494)
  20. [论文翻译]基于图像自适应GAN重建

热门文章

  1. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing....
  2. 软件著作权申请流程详解
  3. 北京邮政回应地摊摆卖邮件:客户自己弄丢的
  4. 小儿反复发低烧医案一则
  5. 网站热度常用评价指标
  6. 读懂这篇文章,你就懂了全网通5.0
  7. 【新能源汽车维修-0525】
  8. 小红书kol资源怎么找?小红书kol资源有哪些途径?
  9. JavaWeb 开发 06 —— smbms项目实践
  10. 防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙