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个点平均距离的最小值。