• TZOJ--4687: 除法 (枚举)


    4687: 除法 

    描述

    一道简单的枚举题

    输入

    输入包括多个正整数n,2<=n<=79。

    输出

    按从小到大的顺序输出所有形如 abcde/fghij = n的表达式,其中a~j恰好为数字0~9的一个排列。

    没有满足要求的等式,输出Error

    样例输入

    62

    样例输出

    79546 / 01283 = 62
    94736 / 01528 = 62

    题目来源

    LRJ小白书

     

    首先,题目为0-9的一个排列代表了a~j中没有重复的数字。我们要计算出所有的可能性,只需要遍历所有5位数判断一下是否满足题目要求即可。

    当然我们还可以对其进行优化,因为没有重复的数字我们只需要从01234开始遍历,n最小为2,所以最大值为49876(49876*2=99752>98765),当然我们也可以遍历到了一个数字乘n大于了98765就退出。

    然后判断没有重复的数字,数字只有0-9,所以采用桶排序,比如出现了5,就a[5]+1,判断一下是否大于1,大于1就出现了意味着重复。

    虽然发现做题的大部分都会一点C++了,我还是写了一份GCC代码(0MS通过)

    代码如下:

    #include<stdio.h>
    int num[11];
    int judge(int a, int b) {
    	int pos=5,i;
    	for(i=0;i<10;i++)num[i]=0;
    	while (pos--) {
    		num[a%10]++;//出现了这个数字就+1 
    		num[b%10]++;
    		if(num[a%10]>1||num[b%10]>1)return 0;//判断是否重复 
    		a/=10;
    		b/=10;
    	}
    	return 1;
    }
    int main() {
    	int n,s,i,j;
    	while(~scanf("%d",&n)){
    		s=0;
    		for (i=1234;i<=49876;i++){//49876*2=99752 
    			j=i*n;
    			if(j>98765)break;//i是递增的,i*n大于,(i+1)*n必然大于 
    			if(judge(i,j)){
    				s++;
    				printf("%05d / %05d = %d
    ",j,i,n);
    			}
    		}
    		if(s==0)printf("Error
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    2014年广州区域赛k题解
    2014年广州区域赛e题解
    2014年广州区域赛i题解
    最大化平均值问题
    codeforces 976e 题解
    maven
    机器学习入门
    拟合
    插值
    熵权法
  • 原文地址:https://www.cnblogs.com/Anidlebrain/p/10071699.html
Copyright © 2020-2023  润新知