1. 标题:好好学习
汤姆跟爷爷来中国旅游。一天,他帮助中国的小朋友贴标语。他负责贴的标语是分别写在四块红纸上的四个大字:“好、好、学、习”。但是汤姆不认识汉字,他就想胡乱地贴成一行。
请你替小汤姆算一下,他这样乱贴,恰好贴对的概率是多少?
答案是一个分数,请表示为两个整数比值的形式。例如:1/3 或 2/15 等。
如果能够约分,请输出约分后的结果。
注意:不要书写多余的空格。
请严格按照格式,通过浏览器提交答案。
注意:只提交这个比值,不要写其它附加内容,比如:说明性的文字。
【分析】排列组合问题 全排列+枚举
#include
#include
using namespace std;
int main()
{
int a[4]={1,1,2,3}; //1-好 2-学 3-习
int cnt=0,tot=0; //cnt-贴对的情况数 tot-可能的情况总数
do
{
tot++;
cout<
if(a[0]==1 && a[1]==1 && a[2]==2 && a[3]==3)
cnt++;
} while(next_permutation(a,a+4));
cout<
return 0;
}
【答案】1/12
2. 标题:埃及分数
古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。
这里,a 和 b 必须是不同的两个整数,分子必须为 1
比如,2/15 一共有 4 种不同的分解法(姑且称为埃及分解法):
1/8 + 1/120
1/9 + 1/45
1/10 + 1/30
1/12 + 1/20
那么, 2/45 一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)? 请直接提交该整数(千万不要提交详细的分解式!)。
请严格按照要求,通过浏览器提交答案。
注意:只提交分解的种类数,不要写其它附加内容,比如:说明性的文字
【分析】循环+枚举
分析此题,因为要求将分数2/45拆成两项,分子为1,两个分数的分母为a和b,因此可采用枚举法,枚举所有可能情况(这里取a=45时是无解的,因为要求a和b必须是不同的两个整数。
#include
#include
int main()
{
int cnt=0;
int a,b;
double left,right;
for(a=2;a<45;a++)
{
for(b=a+1;b<=10000000;b++)
{
left=1.0/a+1.0/b;
right=2.0/45;
if(fabs(left-right)<1e-8)
{
printf("1/%d+1/%d=2/45\n",a,b);
cnt++;
}
}
}
printf("%d\n",cnt);
return 0;
}
【答案】7
3. 标题:正负金字塔
看下面的图形:
+ - + - - + - + - - + - - + -
- - - + - - - - + - - + - -
+ + - - + + + - - + - - +
+ - + - + + - + - - + -
- - - - + - - - + - -
+ + + - - + + - - +
+ + - + - + - + -
+ - - - - - - -
- + + + + + +
- + + + + +
- + + + +
- + + +
- + +
- +
-
它是由正号和负号组成的金字塔形状。其规律是:每个符号的左上方和右上方符号如果相同,则输出为正号,否则为负号。其第一行数据由外部输入。
以下代码实现了该功能。请仔细阅读代码,并填写划线部分缺失的代码。
【分析】字符处理问题
要注意填空位置等号左边的x[i]是当前行的字符,等号右边的x[i]和x[i+1]是上一行的字符,即当前位置字符的左上方和右上方字符。(PS:题目有一个特别特别特别坑的地方,测试函数中的test应改为main,否则无法编译。。)
#include
void f(char* x, int space, int n)
{
int i;
if(n<1) //所打印行的字符数为0,直接返回,结束
return;
for(i=0; i
printf(" ");
for(i=0; i
printf("%c ", x[i]);
printf("\n");
for(i=0; i
x[i] =(x[i]==x[i+1])?'+':'-';
f(x,space+1,n-1);
}
// 用于f的测试
int main()
{
char x[] = "+-+--+-+--+--+-"; //第一行数据由外部输入
//char x[] = "+-+";
f(x, 5, sizeof(x)-1);
return 0;
}【答案】(x[i]==x[i+1])?'+':'-'