CNUOJ 0703 20701除法

來源:互聯網
上載者:User

標籤:

 

20701除法

難度層級: B; 程式設計語言:不限;已耗用時間限制:1000ms; Runspace限制: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除法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.