Uva 725 Division(简单枚举)

这题算是自己系统学习暴力求解法做的第一道题。总结如下:
1.在付诸于实践之前,将问题进行分析,有利于使暴力求解不单单只是暴力,还有点巧劲。
2.如一道题中有多个对象,要选取合适的对象(如范围好确定的,能乘法的不用除法等),确定其枚举范围,通过它来求解其他对象。
3.枚举目前遇到的两种思路:
1)生成—测试法:将枚举的范围扩大,再对求解出的东西进行测试看是否满足要求。适用于在枚举范围不好缩小得正正好的情况。
2)测试—生成法:就在枚举范围中处理(所谓测试,即测试是否在枚举范围中,与上面不同)。
在本题中,使用第二种很难,因为不好控制abcde和fghij是0~9的全排列。

#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=10000000000;
int main(){
    int abcde,fghij,n;
    int cnt=0;
    int number[10];
    char sequence[20];
    while(scanf("%d",&n)==1&&n){
        if(cnt!=0) printf("\n");
        bool solution=false;
        for(fghij=1234;fghij<=98765;fghij++){  //范围可以分析得出
        memset(number,0,sizeof(number));
        memset(sequence,0,strlen(sequence));
        abcde=fghij*n;
        if(abcde+fghij>=maxn||(abcde>98765)) break;  //终止枚举的条件可以分析得出
        sprintf(sequence,"%d%d",abcde,fghij);
        for(int i=0;i<strlen(sequence);i++){
            number[sequence[i]-'0']++;
        }
        bool legal=true;
        for(int i=1;i<10;i++)  if(number[i]!=1) {legal=false;break;}
        if(number[0]!=1&&number[0]!=0) legal=false;
        if(!legal) continue;
        solution=true;
        if(number[0]==0) sprintf(sequence,"%d%s%d%d%s%d",abcde," / ",0,fghij," = ",n);
        else sprintf(sequence,"%d%s%d%s%d",abcde," / ",fghij," = ",n);
        printf("%s\n",sequence);
    }
        if(!solution) printf("There are no solutions for %d.\n",n);
        cnt++;
    }

} 

注意点:
1.sprintf的用法
2.是99999(上面的98765),不是9999

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值