码迷,mamicode.com
首页 > 其他好文 > 详细

CNUOJ 0703 20701除法

时间:2015-07-13 23:57:40      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

 

20701除法

难度级别: B; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
输入正整数n,按从小到大的顺序输出所有满足表达式abcde/fghij=n的abcde和fghij,其中a~j恰好为数字0~9的一个排列。 如果没有符合题意的数,输出0。本题所说的五位数可以包括前导0的,如01234在这里也称为五位数。
输入
一个正整数n 
输出
若干行,每行包括两个符合要求的五位正整数(每行的两个数先大后小),两数之间用一个空格隔开。 
输入示例
62
输出示例
79546 01283
94736 01528
其他说明
数据范围 2≤n≤79;题目中的从小到大指的是输出数据每行的第一个数是从小到大的顺序。 

首先拿到这道题,最先的思路肯定是暴搜。也就是说,要把两个数都枚举出来再进行验证?当然不用,我们只要枚举出一个数来,就可以找到另一个数了。于是我们得到了一个初级代码:

#include<cstdio>
int n,x,y;
int main()
{
    scanf("%d",&n);
    int f,g,h,i,j;
    for(int a=0;a<=9;a++)
    {
        for(int b=0;b<=9;b++)
        {
            b+=(b==a);
            if(b>9) break;
            for(int c=0;c<=9;c++)
            {
                c+=(c==a);
                c+=(c==b);
                if(c>9) break;
                for(int d=0;d<=9;d++)
                {
                    d+=(d==a);
                    d+=(d==b);
                    d+=(d==c);
                    if(d>9) break;
                    for(int e=0;e<=9;e++)
                    {
                        e+=(e==a);
                        e+=(e==b);
                        e+=(e==c);
                        e+=(e==d);
                        if(e>9) break;
                        for(int u=1;u<=1;u++)
                        {
                        x=a*10000+b*1000+c*100+d*10+e;
                        y=x*n;
                        if(y>99999) break;
                        //printf("%d %d",x,y);
                        f=y/10000;
                        g=(y%10000)/1000;
                        h=(y%1000)/100;
                        i=(y%100)/10;
                        j=y%10;
                        if(f==g||f==h||f==i||f==j) break;
                        if(g==h||g==i||g==j) break;
                        if(h==i||h==j) break;
                        if(i==j) break;
                        if(f==a||f==b||f==c||f==d||f==e) break;
                        if(g==a||g==b||g==c||g==d||g==e) break;
                        if(h==a||h==b||h==c||h==d||h==e) break;
                        if(i==a||i==b||i==c||i==d||i==e) break;
                        if(j==a||j==b||j==c||j==d||j==e) break;
                        else printf("%d %d%d%d%d%d\n",y,a,b,c,d,e);
                        }
                    }
                }
            }
        }
    }
    //system("pause");
}

然而当你兴奋地提交上去之后,却会发现要么就是结果错误要么就是时间超限。这是程序效率太低的缘故,这时我们不妨换一个方式来枚举,只用一个循环,就可以把所有的数都枚举出来,时间复杂度还会大大减少。

#include<iostream>
long long n,x,y;
bool t[9];
int o=0;
int main()
{
    scanf("%lld",&n);
    long long f,g,h,i,j,a,b,c,d,e;
    for(x=1234;x<99999;x++)
    {
        for(int u=1;u<=1;u++)
        {
        f=x/10000;
        g=(x%10000)/1000;
        h=(x%1000)/100;
        i=(x%100)/10;
        j=x%10;
        if(f==g||f==h||f==i||f==j) break;
        if(g==h||g==i||g==j) break;
        if(h==i||h==j) break;
        if(i==j) break;
        y=x*n;
        if(y>=99999) break;
        a=y/10000;
        b=(y%10000)/1000;
        c=(y%1000)/100;
        d=(y%100)/10;
        e=y%10;
        if(a==b||a==c||a==d||a==e) break;
        if(b==c||b==d||b==e) break;
        if(c==d||c==e) break;
        if(d==e) break;
        for(int l=0;l<=9;l++) t[l]=0;
        t[a]=1;t[b]=1;t[c]=1;t[d]=1;t[e]=1;t[f]=1;t[g]=1;t[h]=1;t[i]=1;t[j]=1;
        for(int l=0;l<=9;l++) if(!t[l]) goto lab;
        o++;
        printf("%lld%lld%lld%lld%lld %lld%lld%lld%lld%lld\n",a,b,c,d,e,f,g,h,i,j);
lab:
int p; } } if(!o) printf("0"); //system("pause"); }

 

CNUOJ 0703 20701除法

标签:

原文地址:http://www.cnblogs.com/xiaoshenWXY/p/4644090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!