【Division UVa 725】解题心得---java语言 暴力枚举

【题目描述】
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中,a-j恰好为数字0-9的一个排列(可以有前导0),2<=n<=79。
【输入格式】
62
【输出格式】
76508/1234=62
78430/1265=62
题目分析:
首先,这是一个简单枚举问题,需要枚举的是给定商,列举不重复五位数与五位数的除法的除数与被除数。
根据题目,n的最小值为2,所以fghij要小于等于abcde,所以只要列举出fghij的可能取值,就可以确定abcde。
我们设abcde为变量num1,fghij为变量num2。所以,num1=num2*n,并且num2的取值范围为1234<=num2<=50000。
所以问题规模大大缩小,这样一来,枚举所需要的时间也大大降低。
更进一步思考,这10位数字应该是各不相同,0到9这10个数字应该只出现一次,并且都要出现。
所以在枚举num2时的条件就可以得出了:这两个值的各位数字出现次数都为1,并且0到9都出现。
所以,这一块可以利用桶排序的思想来做:
开辟一个长度为10的整型数组,如果下标所对应的数字在两个值中出现,那么下标所对应的元素值+1,这样通过最后判断整个数组的情况可以得出是否所有数字都出现且只出现一次。
源代码如下:

import java.util.Scanner;
public class Division {
	//分离各位数字
	public static void getNum(int x,int[] temp) {
		int k=0;
		while(k<5) {
			temp[k++]=x%10;
			x/=10;
		}
		return;
	}
	
	public static void main(String[] args) {
		int num1;
		//标记变量
		int temp=0;
		//数字数组
		int[] pos=new int[10];
		//num1的各位数字
		int[] n1=new int[5];
		//num2的各位数字
		int[] n2=new int[5];
		Scanner input = new Scanner(System.in);
		int n=input.nextInt();
		for(int i=1234;i<50000;i++) {
			num1=n*i;
			//num1不大于99999
			if(num1>99999)
				continue;
			Division.getNum(i, n2);
			Division.getNum(num1, n1);
			//各位数字在数组中倒序存放,所以要判断最后一个元素是否为0
			if(n1[4]==0);
			else
				//不为零则对应数字0要+1
				pos[n1[4]]++;
			if(n2[4]==0);
			else
				pos[n2[4]]++;
			//统计各位出现次数
			for(int k=0;k<4;k++) {
				pos[n1[k]]++;
				pos[n2[k]]++;
			}
			//判断是否符合标准
			for(int x=0;x<10;x++)
				if(pos[x]>1)
					temp=1;
			if(temp==0)
				System.out.println(num1+"/"+i+"="+n);
			//进行下一次循环
			for(int x=0;x<10;x++)
				pos[x]=0;
			temp=0;
		}
		input.close();
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值