北理计算机学院2001年机试真题

北京理工大学计算机学院复试上机题目

  由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,如有交流请加QQ1585583870,转载请注明,谢谢合作!

A部分

1. 编写程序,计算下列分段函数 y=f(x)的值。

y= -x+2.5,0<= x <2

y=2-1.5(x-3)(x-3),2<= x<4

y=x/2-1.5,4<= x <6。

 


2. 编写程序,读入一个整数 N。若 N 为非负数,则计算 N 到 2N 之间的整数和;若 N 为一个负数,则求 2N 到 N 之间的整数和。

 

3. 设 N 是一个四位数,它的 9 倍恰好是其反序数(例如:1234的反序数是 4321),求 N 的值。

 

4. N 个人围成一圈顺序编号,从 1 号开始按 1、2、 3 顺序报数,报 3 者退出圈外,其余的人再从1、2、 3 开始报数,报 3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环形链表编程。

#include<iostream>
using namespace std;

struct Node{
	int number;
	Node *next;
};

int main(){
	int n;
	cout<<"请输入人数n:";
	cin>>n;
	// 判错
	if(n<=0){
		cout<<"输入不合法!"<<endl;
		return 0;
	}

	// 构造循环链表
	Node *l,*p;
	l=(Node *)malloc(sizeof(Node));
	l->number=1;
	l->next=l;
	p=l;
	for(int i=2;i<=n;i++){
		Node *q;
		q=(Node *)malloc(sizeof(Node));
		q->number=i;
		q->next=p->next;
		p->next=q;
		p=q;
	}
	
	// 当前人数
	int k=n;
	// 现在,p结点指向l
	p=l;
	while(k>0){
		p=p->next;
		p=p->next;
		// 输出现在退出的位置
		cout<<p->number<<" ";
		// 删除结点
		if(p->next!=p){
			p->number=p->next->number;
			// 释放空间
			Node *q;
			q=p->next;
			p->next=q->next;
			free(q);
		}
		else
			free(p);
		k--;
	}

	return 0;
}

补充使用顺序表(数组)的做法:

#include<iostream>
using namespace std;

int main(){
	int n,count=1,i=0;
	int p[100]={0};
	cout<<"请输入人数n:";
	cin>>n;
	// count记录退出的序号,i记录当前报数的位置,n是总人数
	while(count<=n){
		// 当遇到值为0,表明此位置还未退出,i++;否则,该位置已退出,忽略该位置
		for(int flag=1;flag<=3;i=(i+1)%n)
			if(p[i]==0)
				flag++;
		
		// 回退最后一次无效的i++;加n的作用是补正
		i=(i+n-1)%n;
		// 在数组当前位置上,记录退出的序号
		p[i]=count++;
	}
	// 按退出的顺序,输出位置
	for(int k=1;k<=n;k++)
		for(int j=0;j<n;j++)
			if(p[j]==k)
				cout<<j+1<<" ";
	cout<<endl;

	return 0;
}

B部分

1. 请输入高度 h,输入一个高为 h,上底边长为 h的等腰梯形(例如 h=4,图形如下)。

       ****

     ******

   ********

 **********

#include<iostream>
using namespace std;

int main(){
	int h;
	cout<<"请输入h的值:";
	cin>>h;
	for(int i=0;i<h;i++){
		for(int j=0;j<h-i-1;j++)
			cout<<" ";
		for(int k=0;k<h+i*2;k++)
			cout<<"*";
		cout<<endl;
	}

	return 0;
}

2. 请编写一个程序,从键盘上输入 n(n 的范围是1~20),求 n 的阶乘。

#include<iostream>
using namespace std;

int f(int k){
	if(k==0)
		return 1;
	return k*f(k-1);
}

int main(){
	int n;
	cin>>n;
	cout<<f(n)<<endl;
	
	return 0;
}

3. 从键盘上任意输入一个长度不超过 20 的字符串,对所输入的字符串,按照 ASCII 码的大小从小到大进行排序,请输出排序后的结果。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
	string str;
	cout<<"请输入字符串:";
	cin>>str;
	sort(str.begin(),str.end());
	cout<<"排序后的结果为:"<<str<<endl;
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值