暴力求解法--简单枚举(Division,UVa 725)

输入正整数 n ,按从小到大的顺序输出所有 形如 abcde/fghij = n 的表达式,其中
a~j 恰好为数字 0~9 的一个排列(可以有 前导 0),2<=n<=79
样例输入
62
样例输出
79546/ 01283 = 62
94736/ 01528 = 62

/*是紫书上的一个 例题
首先方法就是 枚举,但是枚举时对问题进行一些分析能让代码简洁
本题就是 不需要去枚举 0~9 排列,只需要枚举 fghij 就可以算出 abcde ,然后判断是否所有数字都不相同即可,不需要列举 10 个循环
终止条件就是 被除数要小于 98765 (因为 要不相同的数字才满足条件,所以 98776 是不满足条件的)
注意的是:
1、被除数是不能有前导 0 的,除数可以有前导0
    如果被除数有 0 的话,其实就是一个 四位数,那么除数是 4位数的话,不满足条件 ,若是 5 位数,则得到的商是 小数
2、for 循环的起始和终止条件,由于每一位上的数都是不同的,所以就从 1234开始,然后 98765结束 就 OK
3、输出格式 ,要满足 5 位数并有可能是 前导 0的情况,所以就 输出 %05d
4、由于 i 是从小到大循环的,所以输出的时候一定是按 从小到大输出的,不必再去考虑顺序问题
*/
代码 1(被调) :
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int divv(int a,int b)
{
    int s[15]={0},i,sum=0;//定义s数组,来存每一位数出现了几次
    memset(s,0,sizeof(s));
    if(b>98765)// 终止条件
        return 0;
    if(a<10000)//代表 除数 有前导 0,那么就另 0 为 1,特判
        s[0]=1;
    while(a)
    {
        s[a%10]++;
        a/=10;
    }
    while(b)
    {
        s[b%10]++;
        b/=10;
    }
    for(i=0;i<=9;i++)
        if(s[i]==1)//代表就出现了一次,才是满足条件的
            sum++;
    if(sum==10)//如果 10 个数都不相同的话,就满足条件
        return 1;
    else
        return 0;
}
int main()
{
    int n,i,b,m,flag,sum=0,z,sum1=0;
    while(~scanf("%d",&n))
    {
        m=0;
        for(i=1234;i<=98765;i++)
        {
            m=0;
            b=i*n;
            m=divv(i,b);
            if(m==1){
                printf("%05d/%05d=%d",b,i,n);
                printf("\n");
            }
        }
    }
}

代码 2#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,i,j,b,m,a,flag,sum=0,z,sum1=0;
    int s[15]={0};
    while(~scanf("%d",&n))
    {
        m=0;
        for(i=1234;i<=98765;i++)
        {
            sum=0;
            memset(s,0,sizeof(s));
            a=i;
            b=i*n;
            m=b;
            if(b>98765)
                break;
            if(a<10000)
                s[0]=1;
            while(a)
            {
                s[a%10]++;
                a/=10;
            }
            while(b)
            {
                s[b%10]++;
                b/=10;
            }
            for(j=0;j<=9;j++)
                if(s[j]==1)
                    sum++;
            if(sum==10)
                printf("%05d/%05d=%d\n",m,i,n);
            else
                continue;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/jkdd123456/article/details/80171406
今日推荐