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

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

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

A部分

1.  某人有 8 角的邮票 5 张,1 元的邮票 4 张,1元 8 角的邮票 6 张,用这些邮票中的一张或若干张可以得到多少种不同的邮资?

#include<iostream>
#include<set>
using namespace std;

/**
* 原理,在计算机中double类型的数据是有误差的,eg:计算机判断1.0可能不等于另一个1.0。
* 因此,数据单位我们采用角,即全部化为整数,这样比较,就不会出现误差了;
* 或者采用a-b<0.1的方式判断a与b相等。
*/

// 存储邮资类型
set<double> s;
set<double>::iterator it;

// i是8角的剩余数量,j是1元的剩余数量,k是1元8角的剩余数量,sum是当前邮资
void f(int i,int j, int k,double sum){
	if(i<0||j<0||k<0)
		return;

	double t=0;
	if(i>0){
		// 取8角的
		t=sum+8;
		// 判断是否已经有这种邮资
		// 没有这种邮资,则加入到记录表中
		if(s.find(t)==s.end())
			s.insert(t);
		f(i-1,j,k,t);
	}
	
	if(j>0){
		// 取1元的
		t=sum+10;
		// 判断是否已经有这种邮资
		// 没有这种邮资,则加入到记录表中
		if(s.find(t)==s.end())
			s.insert(t);
		f(i,j-1,k,t);
	}

	if(k>0){
		// 取1元8角的
		t=sum+18;
		// 判断是否已经有这种邮资
		// 没有这种邮资,则加入到记录表中
		if(s.find(t)==s.end())
			s.insert(t);
		f(i,j,k-1,t);
	}

}

int main(){
	s.insert(0);
	f(5,4,6,0);
	cout<<"共有邮资"<<s.size()<<"种"<<endl;
	cout<<"分别是:"<<endl;
	for(it=s.begin();it!=s.end();it++)
		cout<<*it/10.0<<" ";
	cout<<endl;
}

2.输入 n 值,使用递归函数,求杨辉三角形中各个位置上的值,按照如下形式打印输出图

形。例如:当 n=6 时。

                          1

                      1       1

                 1       2      1

           1       3        3      1

       1       4       6       4      1

   1      5       10    10      5        1

#include<iostream>
using namespace std;

// 第n行,第k列元素的值
long f(int n,int k){
	if(k==0||k==n)
		return 1;
	// 当前元素为肩上两个元素之和
	return f(n-1,k-1)+f(n-1,k);
}

int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		// 打印前面的空格
		for(int k=0;k<n-i;k++)
			cout<<"  ";
		for(int j=0;j<=i;j++)
			cout<<f(i,j)<<"  ";
		cout<<endl;
	}
	
	return 0;
}

B部分

1. 打印所有不超过 n(n<256)的,其平方具有对称性质的数。如 11*11=121。

#include<iostream>
using namespace std;

int main(){
	int mul,n=0;
	int num[5];
	for(int i=1;i<256;i++){
		mul=i*i;
		while(mul){
			num[n++]=mul%10;
			mul/=10;
		}
		int j;
		for(j=0;j<n/2.0;j++)
			if(num[j]!=num[n-j-1])
				break;
		if(j>=n/2)
			cout<<i<<"*"<<i<<"="<<i*i<<endl;
		n=0;
	}
	
	return 0;
}

2. 编写一个求菲波那奇数列的递归函数,输入 n值,使用该递归函数,输出如下图形。例如:当n=6时。

                  0

               0 1 1

           0 1 1 2 3

        0 1 1 2 3 5 8

     0 1 1 2 3 5 8 13 21

 0 11 2 3 5 8 13 21 34 55

#include<iostream>
using namespace std;

void f(int pre1,int pre2,int n){
	if(n==0)
		return;
	cout<<pre1<<" "<<pre2<<" ";
	int newNum1=pre1+pre2;
	int newNum2=pre2+newNum1;
	f(newNum1,newNum2,n-1);
}

int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<(n-i)*2;j++)
			cout<<" ";

		cout<<0<<" ";
		f(1,1,i);
		cout<<endl;
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值