您的位置:首页 > 其它

简单枚举之除法

2017-10-11 13:14 218 查看
题意:给定一个正整数n,请按照从小到大的顺序输出形如abcde / fghij = n的表达式,其中每个字母代表0~9中的一个数字且每个数字只出现一次。

input:有多组输入。输入的每行仅有一个正整数n,当n为-1时表示输入结束。

分析:当我们第一眼看上去可能会觉得,我们需要0-9这个10个数都需要枚举,并且分别代表abcdefghij,但是这样的话枚举量太大了,我们就想着能不能简化一些,通过题目我们知道n是商,fghij是除数,所以我们如果需要知道被除数abcde,只需要n*fghij=abcde,这样枚举量就是从1234--98765这个范围之间了。

#include <iostream>
#include <algorithm>
using namespace std;
int check(int a,int b)
{
int num[10];
for(int i=0;i<10;)//将分子,分母的每个位置上的数都记录在数组里
{
num[i++]=(a%10); a/=10;
num[i++]=(b%10); b/=10;
}
sort(num,num+10);//将数组里面的数字进行排序
for(int j=0;j<10;j++)
{
if(num[j]!=j) return 0;//检查是否有相同的数字
}
return 1;
}
int main()
{
int n,k=1;
cin>>n;
for(int i=1234;i<=98765;i++)
{
if(n==-1) break;
int j=i*n;
if(j>=10234 && j<=98765)
{
if(check(i,j)==1)
{
k=0;
if(i>10000) cout<<j<<"/"<<i<<"="<<n<<endl;
else cout<<j<<"/0"<<i<<"="<<n<<endl;
}
}
}
if(k) cout<<"there are no solution for:"<<n<<endl;
return 0;
}
结论:在枚举复杂对象之前,先尝试着枚举一些相对简单的内容,如整数,子串等,尽管暴力求解枚举不用太动脑筋,但是我们对问题要先进行事前的分析,看看能不能降低枚举量,这样会让算法更加简洁而高效
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  暴力求解法