ZOJ 1003 Crashing Balloon(dfs)

给两个数,要求是从1~100里面挑出的数乘出来的积(也就是说可以分解成一些小于等于100的正整数(每个数只能用一次)的乘积),

但也可能不满足该条件,如果较小的数满足条件而较大的数不满足条件(因为两个数可能存在公共的且必须的因子,如343和49,49是质数,49=49*1,343只能分解成343=49*7,而49已经使用过了),那么久输出较小的数,否则输出较大的数,例如刚才的例子,就输出49

 

这是zoj第一页的题,看到好久了,不会,后来无意看到人家说是搜索,想想也对,递归可以实现,但悲催的一致wa……

求代码的路是扯淡的一路,因为我发现了一个非常之NB的代码,但后来随着点开无数blog,都是这段代码时,我就无语了……

所以我就顺从了,好吧,我也这么写吧……

#include<stdio.h> int flag1,flag2; void dfs(int x,int y,int n) { if(y==1) { flag2=1; if(x==1)flag1=1; //先分解较小数,所以较大数被分解(就是flag1置1)的条件是较小数已经被分解 } if(n>100 || flag1==1 && flag2==1) return;//递归出口:n超过100,或者两个数都被分解 if(y%n==0) dfs(x,y/n,n+1); if(x%n==0) dfs(x/n,y,n+1); dfs(x,y,n+1); } int main() { int a,b,t; while(~scanf("%d%d",&a,&b)) { if(a<b){t=a;a=b;b=t;} //确保a>b flag1=flag2=0; dfs(a,b,2); //从2开始搜索 //printf("%d %d/n",flag1,flag2); if(flag2&&!flag1)printf("%d/n",b);//挑战成功只有一种情况,就是较小数分解成功,大数失败 else printf("%d/n",a); } return 0; } 

你可能感兴趣的:(Blog)