UVA 725 division【暴力枚舉】
阿新 • • 發佈:2017-12-18
輸入 family include turn body int div 給定 nbsp
【題意】:輸入正整數n,用0~9這10個數字不重復組成兩個五位數abcde和fghij,使得abcde/fghij的商為n,按順序輸出所有結果。如果沒有找到則輸出“There are no solutions for N.”。這裏2<=n<=79。
【分析】:
1.因為n>=2,且abcde=fghij×n,滿足abcde>fghij。若a=0,則fghij的最小值為12345,abcde<fghij,矛盾。所以a≠0。
2.因為a≠0,所以12345<=abcde<=98765,01234<=fghij。
3.因為2≤n,且abcde≤98765,那麽fghij = abcde/n,得fghij≤98765/2=49382,所以01234≤fghij≤49382。
4.因為12345≤abcde≤98765,且01234≤fghij≤49382,所以用fghij進行枚舉範圍比較小。(這是在任意的n的條件下得出的結論)
5.對於給定的n,因為abcde≤98765,那麽fghij = abcde/n,得fghij≤98765/n。結論:01234≤fghij≤98765/n。
【代碼】:
#include<bits/stdc++.h> using namespace std; int v[15]; int check(int x,int y) { memset(v,0,sizeof(v)); for(int i=1;i<=5;i++) { v[x%10]++; v[y%10]++; if(v[x%10]>1||v[y%10]>1) return 0; x/=10; y/=10; } return 1; } int main() { int n,t=0,f; while(~scanf("%d",&n),n) { f=0; if(t++) printf("\n"); for(int i=1234;i<=100000/n;i++) { if(check(i,i*n)) { printf("%05d / %05d = %d\n",i*n,i,n); f=1; } } if(!f) printf("There are no solutions for %d.\n",n); } }
UVA 725 division【暴力枚舉】