uva 725 Division

此题很简单,就是暴力枚举,当然也需要有策略,只需要遍历所有的分子就可以了,用set存起来,就行了


//
//  main.cpp
//  uva 725 - Division
//
//  Created by XD on 15/7/26.
//  Copyright (c) 2015年 XD. All rights reserved.
//

#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
using namespace std ;

set<int > g[80]  ;
bool iscorrect(int t[],int j)
{
    int flag[10]  ;
    memset(flag, 0, sizeof(flag)) ;
    for (int i = 0; i < 5; i++) {
        flag[t[i]]= 1 ;
    }
    while (j !=0 ) {
        int temp = j %10 ;
        j =j /10 ;
        if (flag[temp] ==   1) {
            return false ;
        }
        else{
            flag[temp] = 1 ;
        }
    }
    for (int i = 0; i < 10; i++) {
        if (flag[i]==0) {
            return false ;
        }
    }
    return  true ;
}

int getT(int t[])
{
    int  weight= 1 ;
    int result = 0 ;
    for (int i = 0; i < 5; i++) {
        result = result + t[i] * weight ;
        weight*=10 ;
    }
    return result ;
}
int main() {
    for (int n = 2; n < 80; n++) {
        g[n].clear() ;
        int t[5];
        for (int i = 0 ; i < 10; i++) {t[0]=i ;
            for (int j = i+1 ; j < 10; j++) { t[1]= j ;
                for (int  k = j + 1; k < 10; k++) {t[2]= k ;
                    for (int l = k + 1; l < 10; l++) {t[3] = l  ;
                        for (int m = l + 1; m < 10; m++) {
                              t[4]=m ;
                            do{
                                int T = getT(t) ;
                                if (iscorrect(t ,T * n )) {
                                    g[n].insert(T) ;
                                }
                            }while (next_permutation(t, t+5)) ;
                        }
                    }
                }
            }
        }
    }
    int n ;
    int pre = 0 ;
    while (scanf("%d" ,&n)==1 && n!=0) {
        if (pre!= 0) {
            printf("\n") ;
        }
        pre = n ;
        if (g[n].size()== 0) {
            printf("There are no solutions for %d.\n",n) ;
        }
        for (set<int >::iterator it = g[n].begin(); it!=g[n].end(); it++ ) {
            printf("%d / %05d = %d\n" ,*it * n , *it , n ) ;
        }
        
    }

    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值