4687: 除法
描述
一道简单的枚举题
输入
输入包括多个正整数n,2<=n<=79。
输出
按从小到大的顺序输出所有形如 abcde/fghij = n的表达式,其中a~j恰好为数字0~9的一个排列。
没有满足要求的等式,输出Error
样例输入
62
样例输出
79546 / 01283 = 62
94736 / 01528 = 62
题目来源
首先,题目为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\n",j,i,n);
}
}
if(s==0)printf("Error\n");
}
return 0;
}