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 ",j,i,n); } } if(s==0)printf("Error "); } return 0; }