【题目描述】
输入正整数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();
}
}