题目描述:
如果一个数是两个不同质数的积,那么这个数就是一个好的数。众所周知,任何数都可以表示为质数的乘积。现在给你一个数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;
}