2002年清华大学计算机研究生机试真题(第I套)

题目1072:有多少不同的面值组合?

题目描述:

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

输入:

题目没有任何输入

输出:

按题目的要求输出可以得到的不同邮资的数目

#include<iostream>
using namespace std;
int find(int a[],int n,int sum)//邮资查重函数 
{
	for(int i=0;i<n;i++)
	{
		if(a[i]==sum)
			return 0;
	}
	return 1;
}
int main()
{
	int a,b,c;
	int ans[1000],n=0;
	int sum=0;
	for(int a=0;a<=5;a++)//8角的邮票可以选择0-5张 
	{
		for(int b=0;b<=4;b++)//一元的邮票可以选择0-4张 
		{
			for(int c=0;c<=6;c++)//1元8角的邮票可以选择0-6张 
			{
				sum=a*8+b*10+c*18;//为了不用double类型,同时扩大十倍 
				if(find(ans,n,sum)==1)//确保在之前没有出现过这个邮资 
				{
					ans[n]=sum;
					n++;
				}
			}
		}
	}
	cout<<n-1<<endl;
}

题目1073:杨辉三角形

题目描述:

输入n值,使用递归函数,求杨辉三角形中各个位置上的值。

输入:

一个大于等于2的整型数n

输出:

题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应输入n的杨辉三角形。

样例输入:
6
样例输出:
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;
int a[100][100];
int recursion(int i,int j)//杨辉三角的递归求解 
{
	if(a[i][j]==0)//说明a[i][j]未被处理,如果被处理了就直接输出,记忆化操作 !! 
	{
		if(i==j||j==1)//对角线和第一列都是1. 
			a[i][j]=1;
		else
			a[i][j]=recursion(i-1,j)+recursion(i-1,j-1);//递归式 
	}
	return a[i][j];

 } 
int main()
{
	int n;
	while(cin>>n&&n>=2) 
	{
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<=i;j++)
			{
				if(j!=i)
					cout<<recursion(i,j)<<" ";//调用递归函数 
				else
					cout<<recursion(i,j)<<endl;
			 } 
		 } 
	}
	return 0;
}

非递归:

#include<iostream>
using namespace std;
int a[100][100];
int main()
{
	int n;
	while(cin>>n&&n>=2) 
	{
		for(int i=2;i<=n;i++)
			a[i][1]=1;//第一列的数值均为0
		a[2][2]=1;//第一行第一列的元素也是1
		for(int i=3;i<=n;i++)
		{
			for(int j=2;j<=i;j++)
				a[i][j]=a[i-1][j]+a[i-1][j-1];//迭代递推式
		} 
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<=i;j++)
			{
				if(j!=i)
					cout<<a[i][j]<<" ";
				else
					cout<<a[i][j]<<endl;
			 } 
		 } 
	}
	return 0;
}




你可能感兴趣的:(2002年清华大学计算机研究生机试真题(第I套))