题目:
输入整数n,,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列(可以有前导0),
输入:多组数据,最后以0作为结束标记
输出:
2<=n<=79。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62
基本思想就是枚举,枚举分子,由分子推算出分母,再判断分母的值符不符合规定。
但是为了减少枚举的量,加上了start_flag这个变量,一旦分母大于99999,就可以停止枚举了。
#include <iostream> using namespace std; bool vis[10]; //用来表示这个数有没有被用过 int numerator[5]; //分子 int denominator[5]; //分母 int n; int numer = 0, denomi = 0; bool start_flag = true; void check(void){ numer = 0; //这个一定要注意,这个不重复赋值的话程序会出错 for(int i=0; i<=4; ++i) numer = numer*10 + numerator[i]; //还原分子 denomi = numer * n; ///由分子得出分母 if(denomi > 99999) {start_flag = false; return;} //如果分母大于99999 那么递归暂停 for(int i=4; i>=0; --i){ int temp = denomi % 10; if(!vis[temp]) { for(int x=4; x>i; --x) vis[denominator[x]] = true; //讲在检查里面用过的数vis变成true 防止出错 return ; } else{ denominator[i] = temp; vis[temp] = false; //这个temp数被用过了 } denomi /= 10; } for(int i=0; i<=4; ++i) vis[denominator[i]] = true; //还原vis for(int i=0; i<=4; ++i) cout<<denominator[i]; cout<<" / "; for(int i=0; i<=4; ++i) cout<<numerator[i]; cout<<" = "<<n<<endl; } void dfs(int i){ //递归枚举 if(i == 5){ check(); return ; } else for(int x=0; x<=9; ++x) if(vis[x] && start_flag){ //防止之前出现重复的数 vis[x] = false; numerator[i] = x; dfs(i+1); vis[x] = true; } } int main(){ for(int i=0; i<=9; ++i) vis[i]=true; scanf("%d", &n); dfs(0); return 0; }