巧妙填数

一、描述

        将1,2,...,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例。例如:三个三位数192,384,576满足以上条件。
        试求出所有满足条件的三个三位数。

二、格式

  • 输入格式:无输入
  • 输出格式:需要输出全部结果。每行输出3个数 用空格隔开。按照字典序的顺序输出。

三、思路

  1. 基本思路是 遍历 100--999之间的数,并判断是否符合上述条件,若满足则输出。
  2. 设满足条件的三个数分别是a,b,c,考虑到三位数最大是999,所以 a的取值范围应该是:100<a<333,又三位数的三个数字是不能重复的,所以a的最小值应该是123,最大值应该是 329,所以 最终a的范围是 123<=a<=329。
  3. 关于三个数是否满足上述条件的判断:
        分别取三个数的百位、十位、个位上的数字,并存入一个数组int[] a中,
        然后创建一个计数器,接着进行一个两层循环的嵌套,外层循环范围 1<i<10,内层循环范围 0<j<9,内层循环中进行判断:如果 i==a[j], 计数器+1,并中止内层循环。
        等整个两层循环执行完后,对计数器进行判断,如果 计数器 = 9,则是满足条件的三个三位数;如果 计数器<9,则三个三位数不满足条件(组成三个三位数的 9 个数字中有重复的)。
  4. 至于与计数器进行判断的 9 是怎么得来的呢?
        循环遍历数组a,并用数字1 与a[i]比较,如果相等,计数器+1,并中止内层循环。
        在满足条件的情况下,因为数组a中的数是不重复的,所以只有一个1,计数器只能执行一次+1操作。同理用 2 去比较,计数器也只能执行一次 +1。 故分别用1-9去与a[i]比较,计数器会累计进行9次+1操作,则计数器等于9.
        不满足条件时,即数组中有重复的数字,则从1到9中肯定至少缺少一个数字,进行上述操作时因为至少有一次是匹配不到的,所以计数器小于9。如 a={1,2,3,4,4,6,7,8,9} ,缺少了5,当用5去匹配数组a[i]时,则匹配不到,故计数器会少进行一次 +1 操作,计数器的值等于8,小于9。
        理论上,计数器大于9的情况是不可能出现的。

四、代码

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int b = 1;b<4;b++){ //百位上的数字
			for(int s = 1;s<10;s++){  //十位上的数字
				if(s!=b){
					for(int g = 1;g<10;g++){ //个位上的数字
						if(g!=b&&g!=s){
							int num1 = b*100+s*10+g;
							if(num1<333){
								int num2 = num1*2;
								int num3 = num1*3;
								if(geshi(num1,num2,num3)){
									System.out.println(num1+" "+num2+" "+num3);
								}
							}
						}
					}
				}
			}
		}
	}
	
	//对三个三位数是否满足条件进行判断
	public static boolean geshi(int num1,int num2,int num3){
		
		//分别取三个数的 百位、十位、个位上的数字,并存到数组中
		int b1 = num1/100;
		int s1 = num1/10%10;
		int g1 = num1%10;
		int b2 = num2/100;
		int s2 = num2/10%10;
		int g2 = num2%10;
		int b3 = num3/100;
		int s3 = num3/10%10;
		int g3 = num3%10;
		int[] a = {b1,s1,g1,b2,s2,g2,b3,s3,g3};
		
		// 定义计数器
		int flag =0;
		
		//对数组a中是否有重复数字进行判断
		for(int i = 1;i<10;i++){
			for(int j = 0;j<a.length;j++){
				if(i==a[j]){
					flag++;
					break;
				}
			}
		}
		
		if(flag==9){ //满足条件的三个数,返回true
			return true;
		}else{ //不满足条件的三个数,返回false
			return false;
		}
	}
}

 

转载于:https://my.oschina.net/worriedfox/blog/1553468

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值