简单枚举之除法
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这个范围之间了。
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; }结论:在枚举复杂对象之前,先尝试着枚举一些相对简单的内容,如整数,子串等,尽管暴力求解枚举不用太动脑筋,但是我们对问题要先进行事前的分析,看看能不能降低枚举量,这样会让算法更加简洁而高效
相关文章推荐
- 7.1 简单枚举---7.1.1除法
- 简单枚举-除法
- 算法竞赛入门经典 暴力求解法 7.1简单枚举 除法
- ACMjava简单枚举除法,分数拆分,双基回文数,最大乘积
- 暴力求解法之简单枚举--除法
- 简单枚举---除法
- 【算法入门经典】 7.1简单枚举【除法】
- acm-简单枚举-除法(水题)
- uva 10112 - Myacm Triangles 简单计算几何+枚举
- HDU 4770 Lights Against Dudely(枚举子集,简单模拟)
- 算法竞赛入门经典 暴力求解法 简单枚举 7.1.4 双基回文数
- javascript模拟枚举的简单实例
- java中枚举的简单介绍
- HDU1506------据说是DP,我更觉得是简单的枚举
- 简单枚举
- 暴力求解法--简单枚举
- NBUT 1647 又一道简单题【数学+枚举】
- 最简单的暴力求解算法 简单枚举
- 黑马程序员_简单类实现枚举_枚举的高级应用
- 简单枚举IE右键菜单