Uva725部門

Uva725部門

件名の説明:

フォームの全ての出力の小さい順に、正の整数nを入力\(ABCDE / FGHIJ = N \ ) 式、\(AJ \)は、正確に(であってもよい0をリードして)0~9の数を配置。

アイデア:

列挙\(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数字を記録するために、より高速なアプローチがある\(あいうえお\)\(efghi \)配列に取り出したその数字は、最後に番号がない表示された場合は、この配列上の回数を掃引します次いで、式順列を構成しない、1に等しいです。

おすすめ

転載: www.cnblogs.com/patrolli/p/11370210.html