题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B
题意:
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列(可以有前导0),2<=n<=79。输出0结束。
注意:每个案例之间用空格隔开,且0后不需要,注意输出数据的格式。
案例:
input
61
62
0
output
There are no solutions for 61.
79546 / 01283 = 62
94736 / 01528 = 6
思路分析:
被除数一定是5位数,找出所有满足所有数字各不相同的数,存入数组,并将它们各个位置上的数存入数组。
再通过枚举找出所有满足条件的数输出等式或无解。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int b[100000][6]; 5 int main() 6 { 7 int N,i,j,k,n=0,s=0,a[5],t=0; 8 cin>>N; 9 for(i=12345;i<=98765;i++) //找出满足基本条件的所有可能的被除数 10 { 11 a[0]=i%10; 12 a[1]=i/10%10; 13 a[2]=i/100%10; 14 a[3]=i/1000%10; 15 a[4]=i/10000; 16 for(j=0;j<4;j++) 17 { 18 for(k=j+1;k<5;k++) 19 if(a[j]==a[k]) 20 break; 21 if(k<5) 22 break; 23 } 24 if(j>=4) 25 { 26 b[s][5]=i; 27 b[s][0]=i%10; 28 b[s][1]=i/10%10; 29 b[s][2]=i/100%10; 30 b[s][3]=i/1000%10; 31 b[s][4]=i/10000; 32 s++; 33 } 34 } 35 while(N) 36 { 37 if(t++) 38 cout<<endl; 39 n=0; 40 for(i=0;i<s;i++) 41 if(b[i][5]%N==0) //找出满足条件的除数 42 { 43 a[0]=b[i][5]/N%10; 44 a[1]=b[i][5]/N/10%10; 45 a[2]=b[i][5]/N/100%10; 46 a[3]=b[i][5]/N/1000%10; 47 a[4]=b[i][5]/N/10000; 48 for(j=0;j<4;j++) 49 { 50 for(k=j+1;k<5;k++) 51 if(a[j]==a[k]) 52 break; 53 if(k<5) 54 break; 55 } 56 if(j>=4) 57 { 58 for(j=0;j<5;j++) 59 { 60 for(k=0;k<5;k++) 61 if(a[j]==b[i][k]) 62 break; 63 if(k<5) 64 break; 65 } 66 if(j>=5) 67 { 68 n++; 69 printf("%d / %05d = %d\n",b[i][5],b[i][5]/N,N); 70 } 71 } 72 73 } 74 if(n==0) //判断是否有解 75 printf("There are no solutions for %d.\n",N); 76 cin>>N; 77 } 78 return 0;