这题思路不难,用给定的数进行组合,再判断部分积的每一 位是不是在给定数中即可,有 个小小的剪枝,先排序,乘数和被乘数的最高位的记做i,j,则i*j<=num[n-1]; n为给定数的个数。 #include<cstdio> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 10 int num[N]; bool flag[N]; int main(){ freopen("crypt1.in","r",stdin); freopen("crypt1.out","w",stdout); int i,n; memset(flag,0,sizeof(flag)); cin>>n; for(i=0;i<n;i++)cin>>num[i]; sort(num,num+n); for(i=0;i<n;i++)flag[num[i]]^=1; int a,c,c1,c2; int j,k,l,m,ans=0; for(i=0;i<n;i++) { for( l=0;l<n; l++ ) { if(num[i]*num[l]>num[n-1])break;//剪枝 for(j=0;j<n;j++) { for(k=0;k<n;k++) { a=num[i]*100+num[j]*10+num[k]; c1=a*num[l]; if(c1<1000 && flag[c1/100] && flag[(c1%100)/10] && flag[c1%10] ) { c1*=10; for(m=0;m<n;m++) { c2=a*num[m]; if( c2<1000 && flag[c2/100] && flag[(c2%100)/10] && flag[c2%10] ){ c=c1+c2; if(c<10000 && flag[c/1000] && flag[(c%1000)/100] && flag[(c%100)/10] &&flag[c%10] )ans++; } } } } } } } cout<<ans<<endl; return 0; }