浙大OJ 1003 Crashing Balloon 分解因数

🍑 ZOJ 1003 Crashing Balloon
在这里插入图片描述
输入

343 49
3599 610
62 36

输出

49
610
62

🍑 大体思路

🍤 分解两个数的因数对,只要有质因数冲突了,说谎
🍤 无法分解成 0-100 之间的因数,说谎
import java.util.Scanner;

public class Main
{
	static boolean aflag, bflag;// 记录 a b 有无说谎

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext())
		{
			int a = sc.nextInt();
			int b = sc.nextInt();

			if (a < b)//保证 a 是高分方
			{
				int t = a;
				a = b;
				b = t;
			}

//			假设 a b 都说谎
			aflag = false;
			bflag = false;
			dfs(a, b, 1);
			int res = a;
			if (!aflag && bflag)//当 a 说谎 并且 b 没有说谎时,b 才可能赢
				res = b;
			System.out.println(res);
		}

	}

	// m n 为 a b 除去因子后的值,p 为现在搜到的因子数值
	private static void dfs(int m, int n, int p)
	{
		if (m == 1 && n == 1)// 两个数都顺利分解完了(没撒谎),a win(分数高)
		{
			aflag = true;
			return;
		}

		if (n == 1)// b 分解因数成功,至少说明 b 没说谎
			bflag = true;

		while ((p < m || p < n) && (p < 100))
		{
			p++;
			if (m % p == 0)
			{
				dfs(m / p, n, p);
				if (aflag)// 只要 a 没说慌,由于 a 分数高,那肯定是 a win
					return;
			}
			if (n % p == 0)
			{
				dfs(m, n / p, p);
				if (aflag)// 只要 a 没说慌,由于 a 分数高,那肯定是 a win
					return;
			}
		}
	}
}


👨‍🏫 参考文章

posted @ 2023-04-22 10:21  兑生  阅读(10)  评论(0编辑  收藏  举报  来源
Live2D