自己代码的两个失误:
1,既然已经告诉了数字集合是1到9,那么穷举两个乘数就是111~999 和 11~99,没有必要根据用3层循环得出两个乘数
2,没有使用string.h自带的函数sprintf和strchar, 手写判断函数check太繁琐
char c[10],buf[20]; int abc,de,x,y,z; ... ... sprintf(c,"%d",z); --把z中的数值转化为字符传到c数组中 sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z); --多个数值转化 strchr 函数:返回某元素在字符串中位置的指针,不存在则返回NULL,现假定c不存在与数组s中,则 strchr(s,c) == NULL;
来自http://blog.sina.com.cn/s/blog_94146ef20101baow.html
的代码:
# include<stdio.h> # include<string.h> int main(void) { //freopen("crypt1.in","r",stdin); //freopen("crypt1.out","w",stdout); char s[20],buf[20],c[10],d[10],e[10]; int i,ok,abc,de,x,y,z,count = 0; int a[10],n; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) s[i] = a[i]+'0'; s[i] = ''; for(abc=111;abc<=999;abc++) { for(de=11;de<=99;de++) { x = abc*(de%10);y = abc*(de/10);z = abc*de; sprintf(c,"%d",z); sprintf(d,"%d",y); sprintf(e,"%d",x); if(strlen(c)!=4||strlen(d)!=3||strlen(e)!=3) continue; ok = 1; sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z); for(i=0;i<strlen(buf);i++) if(strchr(s,buf[i]) == NULL) { ok = 0; break; } if(ok) count++; } } printf("%dn",count); return 0; }
自己的ugly work,当然也能过:
/* ID: nenusb1 LANG: C TASK: crypt1 */ #include <stdio.h> #include <string.h> #include <stdlib.h> int num[10]; int n; int cmp(const void * a, const void * b){ return (*(int * )a - *(int * )b); } int match(int digit){ int i; for(i=0; i<n; i++){ if(num[i] == digit) return 1; } return 0; } //数字是否存在于给定集合中 int check(int x){ int digit; while(x>0){ digit = x%10; if(!match(digit)) return 0; x = x/10; } return 1; } int main(){ freopen("crypt1.in","r",stdin); freopen("crypt1.out","w",stdout); int i,j,k; scanf("%d",&n); for(i=0; i<n; i++){ scanf("%d", &num[i]); } //排序 qsort(num,n,sizeof(int),cmp); int prod1, prod2,result; int mul[730];//第一个乘数 int count = 0; //需要事前单独生成第一个乘数 for(i=0; i<n; i++){ for(j=0; j<n; j++){ for(k=0; k<n; k++){ mul[count++] = num[i]*100 + num[j]*10 + num[k]; } } } int solutionCount = 0; for(j=0; j<n; j++){ for(k=0; k<n; k++){ for(i=0; i<count; i++){ prod1 = num[j] * mul[i]; prod2 = num[k] * mul[i]; result = prod2 * 10 + prod1; //超过3位, 循环后面的数字只会更大,所以 break ,注意break 的是for i循环 if ( prod1>999 || prod2>999 || result>9999) { break;} //或 含有非集合中的数字, continue if (!check(prod1) || (!check(prod2)) || (!check(result))) continue; solutionCount++; // printf("%d : \n",mul[i]); // printf("%d %d\n", num[j], num[k]); // printf("%d %d\n", prod1, prod2); // printf("-----%d-------\n",result); } } } printf("%d\n",solutionCount); return 0; }