Uva725 除法

Posted patrolli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva725 除法相关的知识,希望对你有一定的参考价值。

Uva725 除法

题目描述:

输入正整数n,按从小到大的顺序输出所有形如\\(abcde/fghij=n\\)的表达式,其中\\(a-j\\)恰好为数字0-9的一个排列(可以有前导0)。

技术图片

思路:

枚举\\(fghij\\),然后计算出\\(abcde\\),看所有的数字是否重复。这里主要是要注意判断0-9数字分别出现一次时的效率问题。

代码实现:
#include <iostream>
#include <map>
#include <algorithm>
#define LL long long
using namespace std;

int main()
    int n;int kase=0;
    while(cin >> n && n)
        int ok = 0;
        
        if(kase > 0) printf("\\n");
        ++kase;
        for(int i = 1234; i < 99999; ++i)
            LL res = (LL)i * n;
            int ii = i;
            map<int, int> num;
            if(res > 98765) continue;  //提前终止条件 
            int k = 0;
            for( ; k < 5; ++k)       //分别取出abcde和efghi各位的数字
                if(!num.count(ii%10))  num[ii%10] = 1; ii/=10;
                else break; //如果某个数字已经出现,那么提前退出。
                if(!num.count(res%10))  num[res%10] = 1; res/=10;
                else break;
            
        //  cout << "k = " << k << "\\n";
            if(k == 5)   //只有当k==5时才说明有满足条件的这样一组算式
                ok = 1;
                if(i < 10000) printf("%ld / 0%d = %d\\n", (LL)i*n, i, n);
                else printf("%ld / %d = %d\\n", (LL)i*n, i, n); 
            
                    //如果遍历完都还没有解,就输出no solution
        if(!ok) printf("There are no solutions for %d.\\n", n);
    
ps:

这里是用map来记录各位数字,更快的做法是,将\\(abcde\\)\\(efghi\\)的各位数字分别取出放进一个数组里面,最后扫一遍这个数组,如果某个数字出现次数不等于1,那么算式就不能构成一个排列。

以上是关于Uva725 除法的主要内容,如果未能解决你的问题,请参考以下文章

UVA725 除法 (Division )

UVA 10375 选择与除法

UVA10375选择与除法

UVA725

uva 725 Division

UVA 725 Division