北航计算机2015年考研机试题

第一题

如果对于两个大于 1 的正整数 x 和 y,x 除了本身以外的因子之和等于 y,y 除了本身以外的 因子之和等于 x,则称 x 和 y 是一对相亲数。比如 220 除了本身以外的因子之和 110+55+44+22+20+11+10+5+4+2+1=284,而 284 除了 本身以外的因子之和 142+71+4+2+1=220,则 220 和 284 就是一对相亲数。 请你编写一个程序计算 x 和 y 分别除了本身以外的因子之和,并判断 x 和 y 是不是一对相亲数。x 和 y 为大于 1 的 int 范围内的整数。
【输入】
x 和 y,空格隔开。
【输出】
第一行输出 x,一个逗号,x 的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。
第二行输出 y,一个逗号,y 的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。
第三行,如果 x 和 y 是一对相亲数输出 1,否则输出 0。文末换行可有可无。

输入:
220 284
输出:
220,110+55+44+22+20+11+10+5+4+2+1=284
284,142+71+4+2+1=220
1

输入:
84 1120
输出:
84,42+28+21+14+12+7+6+4+3+2+1=140
1120,560+280+224+160+140+112+80+70+56+40+35+32+28+20+16+14+10+8+7+5+4+2+1=1904
0

#include
using namespace std;
set<int>s1,s2;
set<int>fun(int k){
    set<int>s;
    for(int i=1;i<k;i++){
        if(k%i==0) s.insert(i);
    }
    return s;
}
int main()
{
    int x,y;
    scanf("%d%d",&x,&y);
    s1=fun(x);
    s2=fun(y);
    set<int>::iterator p;
    int a=0,b=0;
    for(p=s1.begin();p!=s1.end();p++){
        a+=*p;
    }
    for(p=s2.begin();p!=s2.end();p++){
        b+=*p;
    }
    int flag=0;
    if(a==y&&b==x) flag=1;
    printf("%d,",x);
    p=s1.end();p--;
    for(;p!=s1.begin();p--){
        printf("%d+",*p);
    }
    printf("%d=%d\n",*p,a);
    printf("%d,",y);
    p=s2.end();p--;
    for(;p!=s2.begin();p--){
        printf("%d+",*p);
    }
    printf("%d=%d\n",*p,b);
    printf("%d\n",flag);
    return 0;
}

第二题

在计算机屏幕上,有 N 个窗口。窗口边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你用鼠标点击某个点的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会被移到所有窗口的顶层,而剩余的窗口的层次顺序不变,如果你点击的位置不属于任何窗口计算机就会忽略你这次点击。
编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高),然后读入点击的次数和位置(以点击的坐标表示),编写程序求得经过上述点击后的窗口叠放次序。
【假设】:
1、屏幕左下角作为 X 轴和 Y 轴坐标原点,即坐标为(0,0),所有输入的坐标数值都是整数,并且都大于等于 0,小于等于 1000。
2出窗口的叠放次序时从最后点击后最顶层的窗口编号开始按层次依次输出;
3、输入的窗口个数大于 0 并且小于等于 10,点击次数大于 0 并且小于等于 20。
【输入】
第一行窗口个数 n,接下来 n 行每行一个窗口的编号、左下角坐标(x1,y1)、右上角坐标(x2,y3),保证(x1 接下来一行点击次数 k,接下来 k 行每行一个点击坐标。
【输出】
一行 n 个数字,表示 K 次点击后按层次排列的窗口编号,空格隔开。
行末空格与文末换行可有可无。

输入:
4
1 43 31 70 56
2 50 24 80 50
3 23 13 63 42
4 57 36 90 52
4
47 28
73 40
68 32
82 43
输出:
4 2 3 1

注:某一年csp的第二题

#include
using namespace std;
struct node{
    int x1,y1,x2,y2;
    int id;
};
vector<node>v;
bool in(node a,int x,int y){
    return a.x1<=x&&x<=a.x2&&a.y1<=y&&y<=a.y2;
}
void change(vector<node>&v,int k){
    node tmp;
    vector<node>::iterator it=v.begin();
    for(;it!=v.end();it++){
        if((*it).id==k){
            tmp=*it;
            v.erase(it);
            break;
        }
    }
    v.insert(v.begin(),tmp);
}
void fun(int x,int y){
    int len=v.size();
    for(int i=0;i<len;i++){
        if(in(v[i],x,y)){
            change(v,v[i].id);
            break; //找到点击窗口后退出
        }
    }
}
int main()
{
    int n,k;
    cin>>n;
    node t;
    for(int i=0;i<n;i++){
        cin>>t.id>>t.x1>>t.y1>>t.x2>>t.y2;
        v.push_back(t);
    }
    cin>>k;
    int x,y;
    for(int i=0;i<k;i++){
        cin>>x>>y;
        fun(x,y);
    }
    int len=v.size();
    for(int i=0;i<len;i++){
        if(i!=len-1)cout<<v[i].id<<" ";
        else cout<<v[i].id<<endl;
    }
    return 0;
}

第三题

输入一段含标点的英文语段(若干行,以ctrl+z结束),统计这段话出现的所有的词语次数,并按照字典顺序输出所有词语,每输出一个词换一行,然后按字典序输出。

输入:
i like you,i come from China,i want you.
my name is meng
输出:
China 1
come 1
from 1
i 3
is 1
like 1
meng 1
my 1
name 1
want 1
you 2

#include
using namespace std;
bool judge(char c){
    return c==' '||c==','||c=='.';
}
int main()
{
    map<string,int>mp;
    string str,tmp="";
    while(getline(cin,str)){
        tmp="";
        int len=str.size();
        int k=0;
        while(str[k]==' ') k++; //去掉空格
        for(int i=k;i<len;i++){
            if(!judge(str[i])){
                tmp+=str[i];
                if(i==len-1){ //将最后一个英文单词存到容器中
                    if(mp.find(tmp)==mp.end()) mp[tmp]=1;
                    else mp[tmp]++;
                }
            }else{
                if(mp.find(tmp)==mp.end()) mp[tmp]=1;
                else mp[tmp]++;
                tmp="";
            }
        }
    }
    map<string,int>::iterator it=mp.begin();
    for(;it!=mp.end();it++){
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}

你可能感兴趣的:(北航考研机试)