关于#输出格式#的问题,如何解决?

题目描述
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列 , 这个问题的答案就是 , 因为 。
输入格式
共两行,第一行是数列中数的个数 ( ),第二行是由 个不大于 的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出格式
一个整数,即数列中等于其他两个数之和的数的个数。
样例
样例输入
4
1 2 3 4
样例输出
2
要有代码要写思路

双循环计算两数之和,再与原数组值进行比较,相同则加1

#include <iostream>
using namespace std;
int main()
{
    int a[100];
    int n,i,j,m=0,k;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            int s = a[i]+a[j];
            for(k=0;k<n;k++)
            {
                if(s == a[k])
                {
                    m++;
                    break;
                }
            }
        }
    }
    cout<<m;
    return 0;
}

思路:我把输入的数两两相加,保存在一个数组里,最后循环一遍,如果a[i]等于这个数组里的数,就加一,每找到一个就加一,最终输出找到几个

部分解释见注释,样例已过,解惑请采纳!

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[50005],b[50005],i,j,n,tot;//tot:存储有多少个数满足条件,a[50005]是输入用的,b[50005]是保存任意两数之和用的 
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
    }//输入 
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(j==i)
            {
                continue;
            }//避免同一个数相加 
            else
            {
                b[i+j]=1;//如i=2,j=3,那么b[5]=1,表示有5这个和存在 
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        if(b[a[i]])//如果a[i]=3,且b[3]不为0,则做一次加法 
        {
            tot++;
        } 
    }
    cout<<tot;//输出个数 
    return 0;
}

ps:楼上那位第32行是错的,中文逗号?

不就是简单的for循环就能搞定了吗。

当n<=2000左右时,可以用以下代码解决
双循环枚举求和,再把每个数进行比较
样例已过,set优化。

时间复杂度O(N^2)

#include<bits/stdc++.h>
using namespace std;
int n,a[3009];
set<int> mixture;
int main() {
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)//两两枚举求和,放入set中 
        for(int j=i+1;j<=n;j++)
            mixture.insert(a[i]+a[j]);
    int ans=0;
    for(int i=1;i<=n;i++)
        if(mixture.count(a[i]))ans++;//查找set中是否有这个数 
    cout<<ans;
    return 0;
} 

也可以用优化了一点的方法,二分查找

#include<bits/stdc++.h>
using namespace std;
int n,a[3009];
int main() {
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    int ans=0;
    //最小的两个数一定无法作为答案,从第三个数开始算
    for(int i=3;i<=n;i++) {
        //此时从比这个数小的数里取一个数,找到另外一个和它搭配能=当前数的
        for(int j=1;j<i;j++) { 
            //需要找到的另外的数就是(a[i]-a[j])
            //利用二分查找,直接获得这个数的所在位置
            int tmp=upper_bound(a+1,a+1+i,a[i]-a[j])-a;
            if(a[tmp-1]==a[i]-a[j]) {
                ans++;
                break;//退出这一层的for循环 
            }//用得到的位置判断是否去到正确的数 
        }
    }
    cout<<ans;
    return 0;
}