当前位置:主页 > 查看内容

将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3

发布时间:2021-06-10 00:00| 位朋友查看

简介:洛谷三连击---Java解法 题目 将1,2,…,9 共 9 个数分成 3 组分别组成 3 个三位数且使这 3 个三位数构成 1 : 2 : 3 的比例试求出所有满足条件的 3个三位数。 这一题作为洛谷的经典例题有着许多的解法。这里笔者将说出自己看到的或想到的一些想法。 解这道题的……

洛谷三连击---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();
        }
    }
}

运行结果:
在这里插入图片描述

;原文链接:https://blog.csdn.net/m0_51994031/article/details/115559663
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐