UVA 725 UVA 10976 简单枚举

UVA 725
题意:0~9十个数组成两个5位数(或0开头的四位数),要求两数之商等于输入的数据n。abcde/fghij=n。
思路:暴力枚举,枚举fghij的情况算出abcde判断是否符合题目条件。(注意前导零的判断)
枚举的方法为 for(int i=1234;i<=100000/n;i++){} 
#include<cstdio>
#include<cstring>
int num[10];
bool check(int a,int b) {
    memset(num,0,sizeof num);
    if(b>98765) return false;
    if(a<10000) num[0]++;
    if(b<10000) num[0]++;
    while(a) {
        num[a%10]++;
        a/=10;
    }
    while(b) {
        num[b%10]++;
        b/=10;
    }
    for(int i=0;i<10;i++) {
        if(num[i]>1) return false;
    }
    return true;
}
int main() {
    int n,cnt=0;
    while(~scanf("%d",&n),n!=0) {
        if(cnt>0) printf("
");cnt++;
        int flag=0;
        for(int i=1234;i<=100000/n;i++) {
            if(check(i,i*n)) {
                flag=1;
                printf("%05d / %05d = %d
",i*n,i,n);
            }
        }
        if(flag==0) printf("There are no solutions for %d.
",n);
    }
    return 0;
}
 
 
UVA 10976
题意:输入正整数k,找到所有的正整数x>=y使得1/k=1/x+1/y;
思路:枚举x,y,考虑枚举范围,因为x>=y,1/x<=1/y,所以y<=2k。在k+1到2k范围内枚举y,计算出对应的x。
#include<cstdio>
int res[10010][2];
int main() {
    int k;
    while(~scanf("%d",&k)) {
        int x,y;
        int cnt=0;
        for(y=k+1;y<=2*k;y++) {
            if((k*y)%(y-k)==0) {
                x=(k*y)/(y-k);
                res[cnt][0]=x;res[cnt++][1]=y;
            }
        }
        printf("%d
",cnt);
        for(int i=0;i<cnt;i++) {
            printf("1/%d = 1/%d + 1/%d
",k,res[i][0],res[i][1]);
        }
    }
    return 0;
}
枚举:根据题目条件,可以缩小枚举的范围,枚举某个数,算出另个数判断是否符合条件。
原文地址:https://www.cnblogs.com/LinesYao/p/5743015.html