北航機試題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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章