当前位置: 首页 > 工具软件 > FLINT > 使用案例 >

Captain Flint and Crew Recruitment(gcd)

钱和安
2023-12-01

题目描述:
如果一个数是两个不同质数的积,那么这个数就是一个好的数。众所周知,任何数都可以表示为质数的乘积。现在给你一个数n,你需要把它拆成四个不同正整数,也就是这四个不同的数的和为n。但这四个数至少有三个数都是好的。

input:
一个数t,表示t组样例。 每组一个数n,保证n在unsigned long long 范围内。

output:
对于每组样例,如果有解,输出“YES”,然后输入任意一组解,即四个数。无解输出"NO"。

example:
Input
3
1
100
53
Output
NO
YES
33 35 6 36
YES
15 21 14 3

解题思路:我们只需要考虑数字最小的情况,找到刚好能满足条件的数据组,那么按照题目最小的数据组,那就是:

a = 2*3 = 6;
b = 2*5 = 10;
c = 2*7 = 14;
d = 3*5 = 15;

这里我们得到了10以内质数相乘的结果,按照题目我们只需要三个,那很明显我们最低要求只需要满足四个数中有a,b,c即可,并且保证d要大于0并且b不能与a,b,c其中一个相等,如果相等那就改变其中一个即可,
那么话不多话,上代码:

#include <iostream>
#include <cstdio>

using namespace std;

int main () {
	int t,n,a,b,c,d;
	cin >> t;
	while (t--){
		cin >> n;
		a = 6;
		b = 10;
		c = 14;
		d = n-(a+b+c);//d可以是随意值,但是要满足上面说的两个条件
		if(d==a||d==b||d==c){//如果d与其中一个相等,就让c的14变15,d就减1,保证最后相加结果等于n
			c += 1;
			d--;
			cout <<"YES\n";
			cout << a << " " << b << " " << c << " " << d << "\n";
		}
		else if(d > 0){//如果大于0并且没有与其他值相等,就直接输出
			cout << "YES\n";
			cout << a << " " << b << " " << c << " " << d << "\n";
		}
		else//如果d小于0,那就不能找到四个数
			cout <<"no\n";
	}
	return 0;
}

 类似资料: