北航上机试题2015(题目+代码)

https://apriljia.com/2018/07/16/%E5%8C%97%E8%88%AA%E4%B8%8A%E6%9C%BA%E8%AF%95%E9%A2%982015%EF%BC%88%E9%A2%98%E7%9B%AE%E4%BB%A3%E7%A0%81%EF%BC%89/

1.求“相亲数”
即输入两个正整数a和b,若a的所有约数(包括1,不包括a本身)的和,等于b,且b的所有约数(包括1,不包括b本身)的和等于a,则两个数是相亲数。要求分别输出两个正整数的约数和的式子,再换行输出1或0,表示这两个数是否为相亲数。
输入:220 284
输出
220,1+2+4+5+10+20+22+44+55+110=284
284,1+2+4+71+142=220

1

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;

void yueshu(int n,int *result,int &num){
	num=0;
	result[num++]=1;
	for(int i=2;i<sqrt(n);i++){
		if(n%i==0) {
			result[num++]=i;
			result[num++]=n/i;
		}
	}
	sort(result,result+num);
}

int main(int argc, char* argv[])
{	
	int n1,n2;
	int result1[100],result2[100];
	int num1,num2;
	int sum1=0,sum2=0;
	int i;
	scanf("%d %d",&n1,&n2);
	yueshu(n1,result1,num1);
	cout<<n1<<",";
	for(i=0;i<num1-1;i++){
		cout<<result1[i]<<"+";
		sum1+=result1[i];
	}
	sum1+=result1[num1-1];
	cout<<result1[num1-1]<<"="<<sum1;
	cout<<endl;

	cout<<n2<<",";
	yueshu(n2,result2,num2);
	for(i=0;i<num2-1;i++){
		cout<<result2[i]<<"+";
		sum2+=result2[i];
	}
	sum2+=result2[num2-1];
	cout<<result2[num2-1]<<"="<<sum2;
	cout<<endl;

	if(sum1==n2&&sum2==n1) cout<<"1";
	

	return 0;
}
2.模拟鼠标点击桌面时桌面窗口的叠放次序
先输入一个数字n,表示桌面窗口的数量,再输入n行,每行5个数,分别为窗口ID,窗口左下横坐标,左下角纵坐标,右上角横坐标,右上角纵坐标(坐标均以平魔左下角为0点),先输入的窗口叠放在后输入的窗口上面。再输入m行,表示m次点击,每行两个数,分别表示点击的横坐标和纵坐标,要求按窗口叠放顺序从高到低输出窗口ID.
输入
2
1 5 1 1 5
2 7 1 3 5
3
1 2 
4 3
6 4

输出 2 1

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std; 

struct point{
	int x,y;
};
struct rect{
	int id;
	point zx,ys;
};

rect windows[100];
int n,m;

int dianji(point p){
	int result=0;
	for(int i=0;i<n;i++){
		if(p.x>=windows[i].zx.x&&p.x<=windows[i].ys.x&&p.y>=windows[i].zx.y&&p.y<=windows[i].ys.y)
			return i;
	}
	return -1;
}
void movetop(int index){
	rect r=windows[index];
	for(int i=index-1;i>=0;i--)
		windows[i+1]=windows[i];
	windows[0]=r;
}
void print(){
	for(int i=0;i<n;i++){
			cout<<windows[i].id<<" ";
		}
	cout<<endl;
}
int main(int argc, char* argv[])
{	 
	int i;
	point p;
	int index;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d %d %d %d %d",&windows[i].id,&windows[i].zx.x,&windows[i].zx.y,&windows[i].ys.x,&windows[i].ys.y);
	}
	
	//print();

	scanf("%d",&m);
	for(i=0;i<m;i++){
		scanf("%d %d",&p.x,&p.y);
		index=dianji(p);
		//cout<<index<<endl;
		if(index!=-1){
			movetop(index);
		//	print();
		}
	}

	print();


	return 0;
}
3.统计词语

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

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std; 
struct wordType{
	char word[30];
	int count;
	bool operator <(const wordType w){
		if(strcmp(word,w.word)<0) return 1;
		else return 0;
	}
};
int wordcount=0;
wordType w[100];

int findstr(char *str){
	for(int i=0;i<wordcount;i++){
		if(strcmp(str,w[i].word)==0) return i;
	}
	return -1;
}

int main(int argc, char* argv[])
{	 

	int cindex=0,windex=0;
	char c,str[30];
	while(scanf("%c",&c)!=EOF){
		if(isalpha(c)){
			str[cindex++]=c;
		}
		else{
			str[cindex]=0;
			if(cindex==0) continue;
			cindex=0;
			//cout<<str<<endl;
			windex=findstr(str);
			if(windex!=-1){
				w[windex].count++;
			}else{
				wordType tmp;
				strcpy(tmp.word,str);
				tmp.count=1;
				w[wordcount++]=tmp;
			}
		}
	}
	sort(w,w+wordcount);
	for(int i=0;i<wordcount;i++)
		cout<<w[i].word<<":"<<w[i].count<<endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/mingzhiqing/article/details/81059012