v1429 @ 2019-08-19 16:47:00
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int isprime(int x){
for(int i=1;i<=floor(sqrt(x)+0.5);i++){
if(x%i==0){
return 0;
}
}return 1;}
int main(){
int a[20000]={};
int a1=0;
for(int i=6;i<=19996;i++){
if(isprime(i))a[a1++]=i;
}
int num;
cin>>num;
for(int i=2;i<=a1;i++){
for(int j=i;j<=a1;j++){
for(int k=j;k<=a1;j++){
if(a[i]+a[j]+a[k]==num){
cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<endl;
return 0;
}
}
}
}
}
by Magallan_forever @ 2019-08-19 16:51:09
a数组开到外面吧……
by sy_zmq_001 @ 2019-08-19 17:04:08
@v1429
第一,您计数用的a1++,这样这个数组有效数字从下标0开始。 第二,题目未说不能用重复的数,所以最后的三层循环都应改为从0开始
by sy_zmq_001 @ 2019-08-19 17:07:42
@v1429 第三
for(int i=2;i<=a1;i++){
for(int j=i;j<=a1;j++){
for(int k=j;k<=a1;j++){
//这层循环从j开始的,写错了。
if(a[i]+a[j]+a[k]==num){
cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<endl;
return 0;
}
}
}
}
by v1429 @ 2019-08-19 19:52:25
@sy_zmq_001 谢谢大大,已改正。然后我在本地的DEV C++上运行没有输出任何结果是什么情况?QAQ求救。
by sy_zmq_001 @ 2019-08-20 08:34:04
@v1429 你要不把你新改的代码再发一下
by v1429 @ 2019-08-20 12:30:29
@sy_zmq_001 新的代码经过调试,发现是这一段有问题。我试着让它输出范围内所有质数;输出了20000个零。(isprime是之前定义的函数,质数为一,否则为零)修改成第二段之后输出了乱码。
int a[20000];
int main(){
int a1=0;
for(int i=6;i<19999;i++)
if(isprime(i)){a[++a1]=i;
cout<<a[a1]<<" ";}
//从if开始改成第二段
if(isprimt(i))a[++a1}=i;
int t=sizeof(a);
for(int k=0;k<=a;k++)
cout<<a[a1]<<" ";
by sy_zmq_001 @ 2019-08-20 19:57:04
#include <iostream>
#include <cstdio>
using namespace std;
int n,sum;
bool a[20000];
int vis[20000];
int main(){
scanf("%d",&n);
a[1]=1;
a[2]=0;
int k=1;
for(int i=3;i<=20000;i++)
{ for(int j=i-1;j>=2;j--)
{ if(i%j==0) {a[i]=1;break; }
}
}
for(int i=1;i<=20000;i++)
if(a[i]==0) { vis[k++]=i;sum++;}
for(int i=1;i<=sum;i++)
for(int j=1;j<=sum;j++)
for(int k=1;k<=sum;k++)
if(vis[i]+vis[j]+vis[k]==n)
{ printf("%d %d %d",vis[i],vis[j],vis[k]);return 0;
}
return 0;
}