TZOJ--4687: 除法 (枚举)

4687: 除法 

描述

一道简单的枚举题

输入

输入包括多个正整数n,2<=n<=79。

输出

按从小到大的顺序输出所有形如 abcde/fghij = n的表达式,其中a~j恰好为数字0~9的一个排列。

没有满足要求的等式,输出Error

样例输入

62

样例输出

79546 / 01283 = 62
94736 / 01528 = 62

题目来源

LRJ小白书

 

首先,题目为0-9的一个排列代表了a~j中没有重复的数字。我们要计算出所有的可能性,只需要遍历所有5位数判断一下是否满足题目要求即可。

当然我们还可以对其进行优化,因为没有重复的数字我们只需要从01234开始遍历,n最小为2,所以最大值为49876(49876*2=99752>98765),当然我们也可以遍历到了一个数字乘n大于了98765就退出。

然后判断没有重复的数字,数字只有0-9,所以采用桶排序,比如出现了5,就a[5]+1,判断一下是否大于1,大于1就出现了意味着重复。

虽然发现做题的大部分都会一点C++了,我还是写了一份GCC代码(0MS通过)

代码如下:

#include<stdio.h>
int num[11];
int judge(int a, int b) {
	int pos=5,i;
	for(i=0;i<10;i++)num[i]=0;
	while (pos--) {
		num[a%10]++;//出现了这个数字就+1 
		num[b%10]++;
		if(num[a%10]>1||num[b%10]>1)return 0;//判断是否重复 
		a/=10;
		b/=10;
	}
	return 1;
}
int main() {
	int n,s,i,j;
	while(~scanf("%d",&n)){
		s=0;
		for (i=1234;i<=49876;i++){//49876*2=99752 
			j=i*n;
			if(j>98765)break;//i是递增的,i*n大于,(i+1)*n必然大于 
			if(judge(i,j)){
				s++;
				printf("%05d / %05d = %d
",j,i,n);
			}
		}
		if(s==0)printf("Error
");
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/Anidlebrain/p/10071699.html