给定n个数和一个数m,问这n个数中是否存在两个数的和等于m。
输入
两行,第一行为数n,m,第二行为n个数,每两个数之间用一个空格隔开。
输出
若存在,输出那两个数,小的数先输(若有多组输出两个数差最小(可以为0)的一组),否则输出“No Answer”(不带引号)。
输入样例
(1) 3 2 (2) 5 5
1 2 1 2 3 4 5
输出样例
(1)1 2
(2)2 3
初级版本 时间会长一点
#include<iostream>
using namespace std;
int main(){
int n,m,a[20],b[20],c[20],d[20],k=0;
cin>>m>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(a[i]+a[j]==m){
b[k]=a[i];
c[k]=a[j];
if()
k++;
}
}
}
int min=100000000,x,y;
if(k==0)cout<<"No Answer";
else{
for(int i=0;i<k;i++){
if(b[i]>c[i]){
if(b[i]-c[i]<min){
min=b[i]-c[i];
x=c[i];
y=b[i];
}
}else{
if(c[i]-b[i]<min){
min=c[i]-b[i];
x=b[i];
y=c[i];
}
}
}
cout<<x<<" "<<y;
}
return 0;
}
升级版本 运行时间比初级的短一些 效果是一样的
#include<iostream>
using namespace std;
int main(){
int n,m,a[20],b[20],c[20],d[20],k=0;
cin>>m>>n;
int min=100000000,x,y;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(a[i]+a[j]==m){
if(a[i]>a[j]){
if(a[i]-a[j]<min){
min=a[i]-a[j];
x=a[j];
y=a[i];
}
}else{
if(a[j]-a[i]<min){
min=a[j]-a[i];
x=a[i];
y=a[j];
}
}
k++;
}
}
}
if(k==0)cout<<"No Answer";
else cout<<x<<" "<<y;
return 0;
}