蓝桥杯2011年决赛c++高职

1. 

从4个人中选2个人参加活动,一共有6种选法。
从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。
请仔细分析代码,填写缺少的部分(下划线部分)。
n 个元素中任取 m 个元素,有多少种取法。

#include<iostream>
using namespace std;

int f(int n, int m)
{
	if(m>n) return 0;
	if(m==0) return 1;

	return f(n-1,m-1) + f(n-1,m);
}
void main()
{
	cout<<f(4,2);
}


2.

如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625

下面代码的目的是寻找出2千万以内的所有自守数。

注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。

#include<iostream>
using namespace std;

void zishou()
{
	int n;
	for(n=1; n<20 * 1000 * 1000; n++)
	{
		int n2 = n;  
		int m = 0;
		for(;;)
		{
			if(n2==0) 
			{
				printf("%d\n", n);
				break;
			}
			
			int k = n2 % 10;     // 从末尾开始,取出乘数的每位数字
			m += k * n;          // 累计乘积
			if(m%10!=k) break;   //if(________) break;
			m = m / 10;          // 舍去累计乘积的末位
			n2 =n2/10 ;          //n2 = ___________;  
		}
	}
}

void main()
{
	zishou();
}


3.

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....

请编程,输出所有可能的情况!
注意:左边的两个乘数交换算同一方案,不要重复输出!

#include<iostream>
using namespace std;
int a[9];
void check()
{
	int i,j;
	for(i=0;i<=8;i++)
	{
		for(j=i+1;j<9;j++)
		{
			if(a[i]==a[j])
				return;
		}
	}
	int m,n,x,y;
	m=a[0]*10+a[1];
	n=a[2]*10+a[3];
	if(m>n)
		return;
	x=a[4]*10+a[5];
	y=a[6]*100+a[7]*10+a[8];

	if(m*n==x*y)
	{
		cout<<m<<'*'<<n<<'='<<x<<'*'<<y<<endl;
	}
}

void dfs(int cur)
{
	if(cur>=9)
		check();
	else
		for(int i=1;i<=9;i++)
		{
			a[cur]=i;
			dfs(cur+1);
		}
}
void main()
{
	dfs(0);
}


4.

魔方可以对它的6个面自由旋转。

我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。

各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作

题目的要求是:
用户从键盘输入一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。

例如:在初始状态,应该输出:
绿红白

初始状态下,如果用户输入:
x
则应该输出:
绿白橙

初始状态下,如果用户输入:
zyx
则应该输出:
红白绿

#include<iostream>      
using namespace std;

int p[9][3];  //利用空间八象限来划分,p[0]舍弃不用
		    //p[i][0]表示垂直于x轴的面
			//p[i][1]表示垂直于y轴的面
			//p[i][2]表示垂直于z轴的面

              //0    1    2    3    4    5
char ch[][3]={"绿","蓝","红","橙","白","黄"};

void show()
{	
	cout<<ch[p[1][0]]
		<<ch[p[1][1]]
		<<ch[p[1][2]]<<endl;
}

void X()
{
	p[0][0]=p[1][0];p[0][1]=p[1][1];p[0][2]=p[1][2];
	
	p[1][0]=p[4][0];p[1][1]=p[4][2];p[1][2]=p[4][1];
	p[4][0]=p[8][0];p[4][1]=p[8][2];p[4][2]=p[8][1];
	p[8][0]=p[5][0];p[8][1]=p[5][2];p[8][2]=p[5][1];
	p[5][0]=p[0][0];p[5][1]=p[0][2];p[5][2]=p[0][1];
} 
void Y()
{
	p[0][0]=p[2][0];p[0][1]=p[2][1];p[0][2]=p[2][2];

	p[2][0]=p[1][2];p[2][1]=p[1][1];p[2][2]=p[1][0];
	p[1][0]=p[5][2];p[1][1]=p[5][1];p[1][2]=p[5][0];
	p[5][0]=p[6][2];p[5][1]=p[6][1];p[5][2]=p[6][0];
	p[6][0]=p[0][2];p[6][1]=p[0][1];p[6][2]=p[0][0];
}
void Z()
{
	p[0][0]=p[1][0];p[0][1]=p[1][1];p[0][2]=p[1][2];

	p[1][0]=p[2][1];p[1][1]=p[2][0];p[1][2]=p[2][2];
	p[2][0]=p[3][1];p[2][1]=p[3][0];p[2][2]=p[3][2];
	p[3][0]=p[4][1];p[3][1]=p[4][0];p[3][2]=p[4][2];
	p[4][0]=p[0][1];p[4][1]=p[0][0];p[4][2]=p[0][2];
}
void main()
{      
	p[1][0]=p[4][0]=p[5][0]=p[8][0]=0;
	p[2][0]=p[3][0]=p[6][0]=p[7][0]=1;

	p[1][1]=p[2][1]=p[5][1]=p[6][1]=2;
	p[3][1]=p[4][1]=p[7][1]=p[8][1]=3;	

	p[1][2]=p[2][2]=p[3][2]=p[4][2]=4;
	p[5][2]=p[6][2]=p[7][2]=p[8][2]=5;

	char a[50];
	cin>>a;

	for(int i=0;a[i]!='\0';i++)
	{
		if(a[i]=='x')
			X();
		else if(a[i]=='y')
			Y();
		else if(a[i]=='z')
			Z();
	}

	show();
} 


5.

已知平面上若干个点的坐标。
需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。
每个点的坐标表示为:横坐标,纵坐标
坐标的取值范围是:1~1000
所有点的坐标记录在in.txt中,请读入该文件,然后计算。
注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。
举例:
如果,in.txt 内的值为:
10,10
20,20
80,50
10,20
20,10
则程序应该输出:
11.38
请编程,读入in.txt文件,计算并输出4个点平均距离的最小值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值