標籤:
|
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除法