北京理工大学计算机学院复试上机题目
由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,转载请注明,谢谢合作!
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;
}