CCF201403-1

来源:互联网 发布:qq微信哪个有价值知乎 编辑:程序博客网 时间:2024/05/29 01:54

相反数

问题描述
  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
  第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
  只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2
样例输出
2

问题分析:
方法一:

#include <iostream>#define M 501//相反数using namespace std;int main(int argc, char *argv[]) {    int a[M],N,count=0;    cin>>N;    for(int i=0;i<N;i++){        cin>>a[i];    }    for(int i=0;i<N;i++){        for(int j=i+1;j<N;j++){            if(a[i]+a[j]==0){//互为相反数,相加为零                count++;            }        }    }    cout<<count<<endl;    return 0;}

方法二:

#include <iostream>#include <map>#define M 501//相反数using namespace std;int main(int argc, char *argv[]) {    map<int,int>m;//第一个类型的键类型,第二个是值类型    int N,num,count=0;    cin>>N;    for(int i=0;i<N;i++){        cin>>num;        //如果容器中存在按-num索引的元素,则返回指向该元素的迭代器。        //如果不存在,则返回超出末端迭代器m.end()。        if(m.find(-num)==m.end()){            //数字num的数量+1             m[num]++;         }        else count++;    }    cout<<count<<endl;    return 0;}

方法三:

#include <iostream>#include <cstring>#define M 501#define N 1000//相反数using namespace std;int main(int argc, char *argv[]) {    int n,num,minus,count=0;    int a[N*2+1];    //变量初始化:清零    memset(a,0,sizeof(a));    cin>>n;    for(int i=0;i<n;i++){        cin>>num;        //值映射:从-1000<=v<=1000映射为0<=v'<=2000        minus=N-num;        num+=N;        //判断负值是否已经存在        if(a[minus]==1){            count++;        }        //num存在,进行标记         a[num]=1;    }    cout<<count<<endl;    return 0;   }
原创粉丝点击