第一题
从4个人中选2个人参加活动,一共有6种选法。
从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。
请仔细分析代码,填写缺少的部分(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
// n 个元素中任取 m 个元素,有多少种取法
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);
}
第二题
如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625
下面代码的目的是寻找出2千万以内的所有自守数。
注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。
请分析代码并填写缺失的部分。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
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;
m = m / 10; // 舍去累计乘积的末位
n2 = n2/10; ;
}
}
}
第三题
看下面的算式:
□□ 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
…
请编程,输出所有可能的情况!
注意:左边的两个乘数交换算同一方案,不要重复输出!
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[9] = {1,2,3,4,5,6,7,8,9};
do{
if((a[0]*10+a[1])<(a[2]*10+a[3])&&(a[0]*10+a[1])*(a[2]*10+a[3])==(a[4]*10+a[5])*(a[6]*100+a[7]*10+a[8]))
{
cout<<a[0]<<a[1]<<" x "<<a[2]<<a[3]<<" = "<<a[4]<<a[5]<<" x "<<a[6]<<a[7]<<a[8]<<endl;
}
}while(next_permutation(a,a+9));
return 0;
}
第四题
题目
魔方可以对它的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
则应该输出:
红白绿
请编程实现所述功能。
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
思路来自https://blog.csdn.net/mikasa3/article/details/54412153
#include<bits/stdc++.h>
using namespace std;
string squ[6][4];
void transX()
{
string tem[6][4] = squ;
squ[0][3] = tem[0][2];
squ[0][1] = tem[0][3];
squ[0][2] = tem[0][0];
squ[0][0] = tem[0][1];
squ[4][1] = tem[3][1];
squ[4][0] = tem[3][0];
squ[3][1] = tem[5][2];
squ[3][0] = tem[5][3];
squ[5][2] = tem[2][1];
squ[5][3] = tem[2][0];
squ[2][0] = tem[4][0];
squ[2][1] = tem[4][1];
}
void transY()
{
string tem[6][4] = squ;
squ[2][3] = tem[2][2];
squ[2][1] = tem[2][3];
squ[2][2] = tem[2][0];
squ[2][0] = tem[2][1];
squ[4][3] = tem[0][3];
squ[4][1] = tem[0][1];
squ[1][1] = tem[4][1];
squ[1][3] = tem[4][3];
squ[5][3] = tem[1][3];
squ[5][1] = tem[1][1];
squ[0][3] = tem[5][3];
squ[0][1] = tem[5][1];
}
void transZ()
{
string tem[6][4] = squ;
squ[4][3] = tem[4][2];
squ[4][1] = tem[4][3];
squ[4][2] = tem[4][0];
squ[4][0] = tem[4][1];
squ[0][2] = tem[2][0];
squ[0][3] = tem[2][2];
squ[2][2] = tem[1][0];
squ[2][0] = tem[1][1];
squ[1][0] = tem[3][1];
squ[1][1] = tem[3][3];
squ[3][3] = tem[0][2];
squ[3][1] = tem[0][3];
}
int main()
{
squ[0][0] = squ[0][1] = squ[0][2] = squ[0][3] = "绿";
squ[1][0] = squ[1][1] = squ[1][2] = squ[1][3] = "蓝";
squ[2][0] = squ[2][1] = squ[2][2] = squ[2][3] = "红";
squ[3][0] = squ[3][1] = squ[3][2] = squ[3][3] = "橙";
squ[4][0] = squ[4][1] = squ[4][2] = squ[4][3] = "白";
squ[5][0] = squ[5][1] = squ[5][2] = squ[5][3] = "黄";
string order;
cin>>order;
for(int i = 0;i<order.size();i++)
{
if(order[i]=='x')
{
transX();
}
else if(order[i]=='y')
{
transY();
}
else
{
transZ();
}
}
cout<<squ[0][3]<<squ[2][0]<<squ[4][1]<<endl;
return 0;
}
第五题
已知平面上若干个点的坐标。
需要求出在所有的组合中,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个点平均距离的最小值。
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5
int main()
{
vector<pair<int,int> > point;
for(int i = 0;i<MAXN;i++)
{
int x,y;
scanf("%d,%d",&x,&y);
point.push_back(pair<int,int>(x,y));
}
double mmin = INT_MAX;
double ans = 0;
for(int i = 0;i<MAXN-3;i++)
{
for(int j = i+1;j<MAXN-2;j++)
{
ans=0;
ans+=sqrt(pow(point[i].first-point[j].first,2)+pow(point[i].second-point[j].second,2));
if(ans>=mmin) continue;
for(int k = j+1;k<MAXN-1;k++)
{
ans+=sqrt(pow(point[i].first-point[k].first,2)+pow(point[i].second-point[k].second,2));
ans+=sqrt(pow(point[j].first-point[k].first,2)+pow(point[j].second-point[k].second,2));
for(int l = k+1;l<MAXN;l++)
{
if(ans>=mmin) break;
ans+=sqrt(pow(point[i].first-point[l].first,2)+pow(point[i].second-point[l].second,2));
ans+=sqrt(pow(point[j].first-point[l].first,2)+pow(point[j].second-point[l].second,2));
ans+=sqrt(pow(point[k].first-point[l].first,2)+pow(point[k].second-point[l].second,2));
if(ans<mmin) mmin = ans;
ans-=sqrt(pow(point[i].first-point[l].first,2)+pow(point[i].second-point[l].second,2));
ans-=sqrt(pow(point[j].first-point[l].first,2)+pow(point[j].second-point[l].second,2));
ans-=sqrt(pow(point[k].first-point[l].first,2)+pow(point[k].second-point[l].second,2));
}
ans-=sqrt(pow(point[i].first-point[k].first,2)+pow(point[i].second-point[k].second,2));
ans-=sqrt(pow(point[j].first-point[k].first,2)+pow(point[j].second-point[k].second,2));
}
}
}
cout<<setprecision(2)<<fixed<<mmin/6<<endl;
return 0;
}