问题描述:
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij= n的表达式,其中a~j恰好为数字0 ~ 9的一个排列(可以有前导0),2<=n<=79.
样例输入
62
样例输出
79546 / 01283 = 62
94736 / 01528 = 62
题记
暴力法也有简单和麻烦之分,单纯的全部枚举有10!种,计算量非常可怕。因为n>=2,所以abcde>fghij,a!=0,abcde<=98765,因此可以大致估计fghij的大致范围在01234~98765/n之间,这样一来枚举量大大减少了.
声明:本文的思路和代码均来自他人博客,俺只是为了便于以后查看复习写一写题记和代码的注释方便理解,原文地址如下:
原文地址:https://blog.csdn.net/tigerisland45/article/details/52115616
代码如下
#include <iostream>
#include <stdio.h>
#include <memory.h>
const int digitnum=10;
using namespace std;
//判断abcdefghij是否为0~9的全排列
int check(int abcde,int fghij){
int used[digitnum],d; //used数组存储0~9各数字是否被用过,d用来暂时存放个位数
memset(used,0,sizeof (used));
if(fghij<10000)
used[0]=1; //fghij<10000则f=0,0被用过
while(abcde){
d=abcde%10;
if(used[d])
return 0;
used[d]=1;
abcde/=10;
}
while(fghij){
d=fghij%10;
if(used[d])
return 0;
used[d]=1;
fghij/=10;
}
return 1;
}
int main()
{
int n,abcde,count,end,i;
while(scanf("%d",&n)==1 &&n){
count=0;//数一下对于给定的n有几个满足的式子
end=98765/n;
for(i=1234;i<=end;i++){
abcde=i*n;
if(abcde>=12345&&check(abcde,i)){
printf("%05d / %05d=%d\n",abcde,i,n);
count++;
}
}
if(count==0)
printf("There are no solutions for %d.\n",n);
}
return 0;
}