1. (3')题目标题: 猜年龄
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。
通过浏览器,直接提交他那时的年龄数字。
注意:不要提交解答过程,或其它的说明文字。
【分析】枚举+数位处理
根据题意选取可能的年龄范围(可选取[10, 100]),使用一层循环一次枚举,找到符合要求的解即可。注意对数位的分离、位数判定、排序等操作。
【答案】18
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int i,j;
int n1,n2; //n1.n2分别保存i^3与i^4
int digit[10],len; //digit保存n1.n2中的各数位 len记录位数
int suc; //suc标记i是否符合要求
for(i=10;i<=100;i++) //枚举年龄i
{
n1=i*i*i;
n2=i*i*i*i;
len=0;
while(n1)
{
digit[len++]=n1%10;
n1/=10;
}
if(len==4) //n1是4位数,继续
{
while(n2)
{
digit[len++]=n2%10;
n2/=10;
}
if(len==10) //n2是6位数,继续
{
sort(digit,digit+len); //0,1,2,...,9
suc=1;
for(j=0;j<len;j++)
{
if(digit[j]!=j)
{
suc=0;
break;
}
}
if(suc==1) //符合要求,输出
printf("%d %d %d\n",i,i*i*i,i*i*i*i);
}
}
}
return 0;
}
2. (6')标题: 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
【分析】枚举+去重
a b c d e的取值范围均为[1, 9],使用五重循环枚举即可,并注意去重(5个数字各不相同)
【答案】142
#include <stdio.h>
int main()
{
int a,b,c,d,e;
int n1,n2,n3,n4;
int ans=0;
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{
if(b==a)
continue;
for(c=1;c<=9;c++)
{
if(c==a || c==b)
continue;
for(d=1;d<=9;d++)
{
if(d==a || d==b || d==c)
continue;
for(e=1;e<=9;e++)
{
if(e==a || e==b || e==c || e==d)
continue;
n1=a*10+b;
n2=c*100+d*10+e;
n3=a*100+d*10+b;
n4=c*10+e;
if(n1*n2==n3*n4) //ab * cde = adb * ce
{
printf("%d * %d = %d * %d\n",n1,n2,n3,n4);
ans++;
}
}
}
}
}
}
printf("ans = %d\n",ans);
return 0;
}
3. (8')标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
【分析】搜索(dfs)
可以将“从我做起振兴中华”这8个字对应处理为1~8 8个数字,则符合要求的跳跃路线为12345678(严格单调递增)。此外,根据格子的特点,在搜索时不必使用上下左右4个方向,使用"右"和"下"两个方向即可,因为向左和向上跳格子无法保证路线中的8个数字是严格单调递增的。
【答案】35
#include <stdio.h>
#define maxn 25
int ans=0;
int map[4][5]={ //格子地图(0标记格子已走过)
{1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8}
};
int dir[2][2]={
{0,1},{1,0}}; //跳跃方向
struct Path //保存跳跃路线
{
int x; //横坐标
int y; //纵坐标
} p[maxn];
void dfs(int x,int y,int cur)
{
int i;
int newx,newy,temp;
if(x==3 && y==4)
{
//输出所有符合要求的路线
/*for(i=0;i<cur;i++)
printf("(%d,%d) ",p[i].x,p[i].y);
printf("\n");*/
//方案数+1
ans++;
return;
}
//试探两个方向
for(i=0;i<2;i++)
{
//下一个点
newx=x+dir[i][0];
newy=y+dir[i][1];
//若下一个点不出界,并且没有走过
if(newx>=0 && newx<4 && newy>=0 &&a