关闭

zoj1003 crashing balloon

标签: zoj1003
292人阅读 评论(0) 收藏 举报
  1. #include<stdio.h>
    int flag1, flag2;	//分别表示n, m是否已被成功分解
    void dfs(int n, int m, int fac = 100){
    	if(flag1)	//如果n, m均可分解且因子不同
    		return;
    	if(n == 1 && m == 1){	//n, m均分解完
    		flag1 = 1;
    		flag2 = 1;
    		return;
    	}
    	if(m == 1){ //m分解完
    		flag2 = 1;
    	}
    	if (fac < 2)
    		return;
    	if(n % fac == 0)	//精华之处,对同一个因子不同时分解n, m,难点解决
    		dfs(n / fac, m, fac - 1);
    	if(m % fac == 0)
    		dfs(n, m / fac, fac - 1);
    	dfs(n, m, fac - 1);
    }
     
    int main(){
    	int n, m;
    	while(~scanf("%d%d", &n, &m)){
    		if(m > n){ //交换m, n
    			n = m ^ n;
    			m = m ^ n;
    			n = m ^ n;
    		}
    		flag1 = 0;
    		flag2 = 0;
    		dfs(n, m);
    		if(flag1 || !flag2)	//如果n成功分解货m无法成功分解
    			printf("%d\n", n);
    		else
    			printf("%d\n", m);
    	}
    	return 0;
    }

    //内容来自ConwayTian
  2. /*
  3. blog上一大把,copy,但很多copy的并不是那么好。
  4. */
  5. #include<cstdio>  
  6. #include<algorithm>  
  7. using namespace std;  
  8.   
  9. bool f1, f2;  
  10.   
  11. void dfs(int numa, int numb, int k)  
  12. {  
  13. /*
  14. 解决这个问题时也知道使用递归,但怎么用并不明确,缺少练习。
  15. 解决这个问题,如果把两个数据分别处理,处理量就大了,所以如果能将数据在一块处理,也是蛮好的
  16. */
  17.     if(numb == 1)  
  18.     {  
  19.         f2 = true;  
  20.         if(numa == 1) f1 = true;  
  21.         /*在numb分解完成的情况下,查看numa是否可以分解。 
  22.           这样可以保证某些公因子被numb用了,便不能再被numa用*/  
  23.     }  
  24.   
  25. /*
  26. 还有就是对递归实际代码的理解了,总是认为递归进去,也会出来的,总是在想怎样处理进出关系。
  27. 下边的主要是,把k占住了,代码的设计就是让递归一直下去(这正是数据处理的过程,下走的时候
  28. ,若有公因子,则只能a使用),当都
  29. */
  30.     if(k == 1 || (f1 && f2)) return;  /*要么没有分解完,要么都分解完了,才会停止向下
  31. 递归,开始往回走,回走的过程也会处理一些数据但已经不需要了
  32. 1、都分解完了,
  33. 2、b分解完了,a没有,到底了
  34. 3、b就没分解完,根据题目要求,b的申诉就失败了
  35. */
  36.     if(numa % k == 0) dfs(numa / k, numb, k - 1); //因子k,被a用不被b用  
  37.     if(numb % k == 0) dfs(numa, numb / k, k - 1); //因子k,被b用不被a用  
  38.     dfs(numa, numb, k - 1); //因子k,既不被a用也不被b用  
  39. }  
  40.   
  41. int main()  
  42. {  
  43.     int a, b;  
  44.     while(scanf("%d%d",&a,&b) != EOF)  
  45.     {  
  46.         if(a < b) swap(a, b);  
  47.         f1 = f2 = false;  
  48.         dfs(a, b, 100);  
  49.         if(!f1 && f2) printf("%d\n",b);  
  50.         else printf("%d\n",a);  
  51.     }  
  52.     return 0;  
  53. }  


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50051次
    • 积分:1759
    • 等级:
    • 排名:千里之外
    • 原创:130篇
    • 转载:4篇
    • 译文:0篇
    • 评论:16条
    联系
    scylhy@163.com
    最新评论