ZOJ 1003

来源:互联网 发布:apm软件 编辑:程序博客网 时间:2024/05/01 09:36

这也是一个搜索的问题,搜索两人分数的所有分解方法。当两者的所有分解方式中,都必须使用到某个或某几个相同的因子时,说明报高分的人在撒谎。换句话说,如果两人的分数能够在不占用对方因子的情况下成功分解,那么报高分的人没有撒谎!

注意考虑特殊情况,如果较低分数本身不可能被1到100内的整数分解,那么高分赢,因为在这时,挑战者自己就把自己的分数算错了!


#include<stdio.h>void factoring(int max,int min,int now);int flag1,flag2,ret;              //flag1==1表示大数可分解,flag2==1表示小数可分解,                                  //flag1和flag2保存的状态不保证在受对方干扰下也是如此int main()                        //ret表示在不占用对方因子时,两者中成功分解的个数{int a,b;while(scanf("%d %d",&a,&b)!=EOF){int min,max;flag1 = flag2 = 0;ret = 0;max = a>b?a:b;min = a<b?a:b;factoring(max,min,2);if(ret==1&&flag2==1)              //不占用对方因子时只能有一个数分解成功,而且小数{                                 //可分解,此时挑战成功!printf("%d\n",min);}else{printf("%d\n",max);}}return 0;}void factoring(int max,int min,int now)          {if(now>100)return;else{int i = 0,j = 0;if(max==1){flag1 = 1;i = 1;}if(min==1){flag2 = 1;j = 1;}ret = (i+j)>ret?(i+j):ret;            //更新retif(max%now==0)                         //不同时使用当前因子now,保证不占用对方因子!factoring(max/now,min,now+1);if(min%now==0)factoring(max,min/now,now+1);factoring(max,min,now+1);}}


用全局变量记录状态,然后递归时不断刷新状态。不要忘记每次循环时将状态设为0!


话说,为什么代码片没有C语言的呀,虽然C++也可以,但是还是觉得不爽ing。

0 0
原创粉丝点击