UVa725 Division 除法

题目:

输入整数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;
}

猜你喜欢

转载自www.cnblogs.com/futu-/p/12727555.html