P1579 哥德巴赫猜想(升级版)
1.暴力,枚举思路
这个思路很H,很暴力。
1.根据题目的意思,要三个数的和等于输入的奇数x,则可以写一个函数来判断是不是奇数
2.但也要注意范围,因为数按小小大的顺序排(第一个最小i,其次第二个j)
3.则可以将第一个的范围设为x/3,第二个(x-i)/2
4.然后使用双重for循环判断素数
2.源码
#include<stdio.h>
bool prime(int n)
{
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
int main()
{
int x;
scanf ("%d", &x);
for (int i = 2; i <= x / 3; i++) //数分为三部分,第一份占1/3
{
if (!prime(i)) continue; //是素数,则进入下层for循环
for (int j = 2; j <= (x - i) / 2; j++) //剩下两个数每份占1/2
{
if (!prime(j)) continue; //不是素数,则继续for循环,寻找素数
int k = x - i - j;
if (prime(k))
{
printf ("%d %d %d\n", i, j, k);
return 0;
}
}
}
return 0;
}
3.两步法思路
首先先要明白一件事,三个数相加为奇数,只有两种可能
①两个偶数加一个奇数.
②三个奇数.
①先判断前两个质数都是偶数的情况,因为偶数中只有2是素数,那么就只要判断这个(n-4)是否为素数,如果是,就直接输出2,2,n-4。
②如果这三个数都是质数,那么从i=3开始循环,并保证i为奇数并且i为素数,再在第二重循环里面让j=i并保证j为奇数且j为素数,最后只要判断(n-i-j)是否为奇数且为素数就行了,满足就输出答案。
4.源码
#include<stdio.h>
int check(int x){
for(int i=2;i*i<=x;i++)
if(x%i==0) return 0;
return 1;
}
int main(){
int n;
scanf("%d",&n);
if(check(n-4)) {
printf("2 2 %d",n-4);
return 0;
} //第一种情况
for (int i=3;i<n;i++)//第二种情况
if((i%2)!=0&&check(i))//优化 (i%2)!=0 表示奇数
for (int j=i;j<n;j++)
if((j%2)!=0&&check(j))//优化
if(check(n-i-j)) {
printf("%d %d %d",i,j,n-i-j);
return 0;//不用循环第三个数,优化。
}
}