先写一个判定质数的函数:

int tzyx(int x){int i,z=0;if(x==1){return 0;}if(x>2){for(i=2;i<sqrt(x)+1;i++){//枚举从2~x的方根的数if(x%i==0){z=z+1;//如果能除尽,不是质数,z加一;}}}else{return x;}if(z==0){return x;//如果Z等于零,说明x为质数,返回x}else{return 0;//不是质数,返回零}
}

看到这种题,本蒟蒻首先想到的当然是枚举所有的加数和和数(low爆了
代码如下:

for(i=4;i<=n;i+=2){for(j=2;j<=n/2+1;j++){for(k=2;k<=n;k++){if(j+k==i){if(tzyx(j)!=0&&tzyx(k)!=0){//判断j,k是否为质数if(i==qb){//排除已计算的i值break;}else{cout<<i<<"="<<j<<"+"<<k<<endl;qb=i;}}}}}
}

当然……

最后超时了……

毕竟是蒟蒻的写法……
既然这样不行,那就优化,减少循环的次数和层数,将两个加数放在同一个循环中,枚举总数和其中一个加数,然后求出另一个加数,再判断两个加数是否都是质数,如果都是,先输出枚举的加数(较小),然后对已计算的总数存储,排除重复的总数,就可以输出了(当然不要忘了带上符号)

完整的代码:

	cin>>n;for(i=2;i<=n;i++){if(tzyx(i)!=0){//记录从2~n的所有质数y[s]=i;s++;}}for(i=4;i<=n;i+=2){for(j=0;j<s;j++){op=i-y[j];//y[j]中存储的都为质数if(tzyx(op)!=0&&op>0){//如果op也为质数,进入if(i==qb){//排除重复的i值break;}else{cout<<i<<"="<<y[j]<<"+"<<i-y[j]<<endl;qb=i;}}}}