USACO crypt1
生活随笔
收集整理的這篇文章主要介紹了
USACO crypt1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
自己代碼的兩個失誤:
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; }轉載于:https://my.oschina.net/kaneiqi/blog/223403
總結
以上是生活随笔為你收集整理的USACO crypt1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux常用指令总结一~~
- 下一篇: 雷林鹏分享:PHP 数组排序