本题解分为C语言和Python两种版本的答案代码。
注:B题和F题是破解密码的题目,相信不需要我多说。
A题:爱因斯坦的名言
题目描述
初出茅庐的小伙伴们,你们对编程了解多少?希望你们记住爱因斯坦的这句名言,好好学习,天天向上。
输入描述:
无
输出描述:
输出下面这句话:
"Genius is 1% inspiration and 99% perspiration."
C语言:
#include<stdio.h> int main(){ printf("\"Genius is 1%% inspiration and 99%% perspiration.\""); }
Python:
print("\"Genius is 1% inspiration and 99% perspiration.\"")
本来是一道简单的题目,但是做题的时候也要格外细心,因为双引号和百分号的输出是需要引起注意的,C语言和Python输出双引号都需要反斜杠\,而Python的百分号可以正常输出,C语言却要连着用两个百分号才能正常输出。
(希望大家通过这题了解一下转义字符!)
C题:四季
题目描述
气象意义上,通常以3~5月为春季(spring),6~8月为夏季(summer),9~11月为秋季(autumn),12月~来年2月为冬季(winter)。请根据输入的年份以及月份,输出对应的季节。输入描述:
输入的数据格式是固定的YYYYMM的形式,即:年份占4个数位,月份占2个数位。
输出描述:
输出月份对应的季节(用英文单词表示,全部用小写字母)。
示例1
输入
201901
输出
winter
备注:
输入的年份应该是4位数,输入的月份应该为1~12。
C语言:
#include<stdio.h> int main(){ int n,year,month; scanf("%d",&n); year=n/100; month=n%100; else if(month>=3&&month<=5) printf("spring"); else if(month>=6&&month<=8) printf("summer"); else if(month>=9&&month<=11) printf("autumn"); else printf("winter"); }
Python:
N=int(input()) year=N//100 month=N%100 if 1000<=year<=9999 and 3<=month<=5: print("spring") elif 1000<=year<=9999 and 6<=month<=8: print("summer") elif 1000<=year<=9999 and 9<=month<=11: print("autumn") elif (1000<=year<=9999 and (month==12 or 1<=month<=2)): print("winter")
将输入的数直接分成前四位(年份)和后两位(月份),然后用if else语句判断即可。
D题:前天是哪天
题目描述
给定公元2000年到公元3000年之间的某一天,请你给出该天的前天是哪一天.输入描述:
输入在一个日期,格式如"yyyy-mm-dd",题目保证所有输入日期为合法日期。
输出描述:
在一行中输出日期,格式如"yyyy-mm-dd"。
示例1
输入
2020-11-15
输出
2020-11-13
备注:
注意日期格式,月份或者天数不足2位要补零。
C语言:
#include<stdio.h> int p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int r[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int k[12]={12,1,2,3,4,5,6,7,8,9,10,11}; char week[7][10]={{"Monday"},{"Tuesday"},{"Wednesday"},{"Thursday"},{"Friday"},{"Saturday"},{"Sunday"}}; int isrunnian(int year){ if(year%4==0&&year%100!=0||year%400==0) return 1; else return 0; } int main(){ int year,month,day,a,b,c,w; scanf("%d-%d-%d",&year,&month,&day); day-=2; if(day<=0){ if(isrunnian(year)) day+=r[k[month-1]]; else day+=p[k[month-1]]; month--; if(month==0){ month=12; year--; } } printf("%04d-%02d-%02d\n",year,month,day); }
Python:
def isLeapYear(year): if (year%4==0 and year%100!=0)or (year%100==0 and year%400==0): isLeapYear='True' else: isLeapYear='False' return isLeapYear a=str(input()) a1=a[:4] a2=a[5:7] a3=a[8:] aa1=int(a1) aa2=int(a2) aa3=int(a3) if aa3>12 and aa2>9: a3=str(aa3-2) print(a1+'-'+a2+'-'+a3) elif aa3>12 and aa2<10: a3 = str(aa3 - 2) print(a1 + '-' + a2 + '-' + a3) elif 2<aa3<12 : a3=str(aa3-2) print(a1+'-'+a2+'-'+'0'+a3) elif aa3==1 and aa2==3: if isLeapYear(aa1)=='True': a2=str(aa2-1) print(a1 + '-' +'0'+ a2 + '-' + '28') else: a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '27') elif aa3==2 and aa2==3: if isLeapYear(aa1)=='True': a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '29') else: a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '28') elif aa2 in (2,4,6,8,9) and aa3==1 : a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '30') elif aa2 ==11 and aa3==1 : a2 = str(aa2 - 1) print(a1 + '-' + a2 + '-' + '30') elif aa2 in (2,4,6,8,9) and aa3==2 : a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '31') elif aa2 ==11 and aa3==2 : a2 = str(aa2 - 1) print(a1 + '-' + a2 + '-' + '31') elif aa2 in (5,7,10) and aa3==1: a2 = str(aa2 - 1) print(a1 + '-' +'0'+ a2 + '-' + '29') elif aa2 ==12 and aa3==1: a2 = str(aa2 - 1) print(a1 + '-' + a2 + '-' + '29') elif aa2 in (5,7,10) and aa3==2: a2 = str(aa2 - 1) print(a1 + '-' +'0'+a2 + '-' + '30') elif aa2 ==12 and aa3==2: a2 = str(aa2 - 1) print(a1 + '-' + a2 + '-' + '30') elif aa2==1 and aa3==1: a2 = str(12) a1=str(aa1 - 1) print(a1 + '-' + a2 + '-' + '30') elif aa2==1 and aa3==2: a2 = str(12) a1=str(aa1 - 1) print(a1 + '-' + a2 + '-' + '31')
这题推荐大家用数组来保存每个月份对应的天数,这样代码写得更加方便。需要注意的是,做此题时特别容易忽略对闰年的判断,这里就要考验大家的细心程度了。想要自己的代码不出错,还得学习怎么控制格式(注意位数不足补0),怎么调试代码。
E题:三角形的组合计数
题目描述
三角形是几何的重要基础,几乎所有的几何问题都涉及到三角形,许多著名定理的证明都离不开三角形,例如蝴蝶定理其中的一些证明等,三角形可以与许多几何图形组合在一起,构成简易程度不同的问题,同时三角形的性质,定理也相当广,涵盖几何,代数,泛函分析等许多方面内容。现在就让我们一起来简单的认识一下三角形:
假设三角形的边长为不相等的正整数,且最大边长为n,求这些三角形的个数,并输出从1到n中任取三个不同的正整数,它们可以是一个三角形的三条边的概率。
(注:三角形的三条边是无序的,如a,b,c与a,c,b为同一种)
输入描述:
输入在一行中给出1个正整数T表示测试组数,接下来一行输入T个数,每个数n分别表示每组测试中相应的最大边长。(3 <= n <= 5000) (1 <= T <=3)
输出描述:
对每一组输入,在一行中输出三角形个数,以及1到n中任取三个不同的整数,它们可以是一个三角形的三条边的概率,概率保留三位小数。
示例1
输入
1 3
输出
0 0.000
示例2
输入
2 4 5
输出
1 0.250 3 0.300
C语言:
#include<stdio.h> int main(){ int n,sum=0,s,t; double avg; scanf("%d",&t); while(t--){ sum=0; scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ for(int k=j+1;k<=n;k++){ if(i+j>k) sum++; else break; } } } s=n*(n-1)*(n-2)/6; avg=(double)sum/s; printf("%d %.3f\n",sum,avg); } }
Python:
t=int(input()) n = input() list = [] for i in n.split(): list.append(int(i)) for l in range(0,t,1): sum=0; for i in range(1,list[l]+1,1): for j in range(i+1,list[l]+1,1): for k in range(j+1,list[l]+1,1): if i+j>k: sum=sum+1; else: break; s=list[l]*(list[l]-1)*(list[l]-2)/6; avg=sum/s; print("%d %.3f" %(sum,avg))
这题正确的解法就是暴力枚举,但是很多选手却不敢动手尝试,其实我们很容易知道三角形的特性:两边之和大于第三边。采用三重循环就可以得所有的解。而1到n任取三个整数,所有可能个数其实就是一个组合数,求概率也不是难事。
Python的方法可能难一些,因为题目要求要在一行中输入n个整数,需要用列表list存储数据。
G题:小航的圣诞节
小航在过圣诞节的时候,学校的计算机理论课的老师给他们布置了一道数学题作为圣诞礼物,要求十进制数n(1<=n<=1000)的二进制数中1的个数。小航快算疯了。为了小航能过一个愉快的圣诞节,同学们帮帮小航吧。
输入描述:
输入一个正整数n。
输出描述:
输出一个正整数。
示例1
输入
2
输出
1
C语言:
#include<stdio.h> int main () { int x,y=1,c=0; scanf("%d",&x); y=x; while(y) { if(y%2==1) c++; y=y/2; } printf("%d",c); }
Python:
a=int(input()) b=bin(a) b=str(b) c=b.count('1') print(c)
求2进制中1的个数,可以想到位与运算&,也可以直接写个循环,每次取出n的模2的余数,再将n整除2。在这些模2的余数中,1的个数显然就是所求的结果。
H题:数字菱形
题目描述
输入一个0-9的数字和一个菱形的高度,编程输出这个菱形。
输入描述:
输入一个0-9的数字和一个菱形的高度(假定输入的高度为[3,49]内的奇数),两个整数间有空格分隔。
输出描述:
输出由指定数字开始绘制的指定高度的菱形。注意,编制菱形的数字是依次循环出现的,且整个菱形剧左显示(最宽的那一行,左边无空格)。
示例1
输入
7 5
输出
7 8 8 9 9 8 8 7
备注:
注意不要输出多余空格。
C语言:
#include<stdio.h> int main(){ int h,n,q=1; scanf("%d %d",&n,&h); for(int i=1;i<=h/2;i++) printf(" "); printf("%d\n",n); for(int i=1;i<=h/2-1;i++){ n=(n+1)%10; for(int j=1;j<=h/2-i;j++) printf(" "); printf("%d",n); for(int j=1;j<=q;j++) printf(" "); printf("%d\n",n); q+=2; } n=(n+1)%10; printf("%d",n); for(int i=1;i<=q;i++) printf(" "); printf("%d\n",n); q-=2; for(int i=1;i<=h/2-1;i++){ n=(n+9)%10; for(int j=1;j<=i;j++) printf(" "); printf("%d",n,n); for(int j=1;j<=q;j++) printf(" "); printf("%d\n",n); q-=2; } n=(n+9)%10; for(int i=1;i<=h/2;i++) printf(" "); printf("%d",n); }
Python:
暂无
很显然这题就是用循环结构控制输出格式,考虑到数字是0-9之间,每次对数字进行自增还需对它模10,除了首行和最后一行,每行都有两个数字。从上往下看,菱形的上半部分数字之间的间隔越来越大,下半部分间隔却越来越小(菱形中央间隔最大)。将菱形的每一部分分开处理即可。
I题:烟囱的高度
题目描述
已知人离烟囱的距离为 a,人的眼睛离地高度为 b,人看烟囱顶时的仰角为 θ,求烟囱的高度 h。
输入描述:
a b c
d m s
注:a、b 的单位为米,均为小数。c是小数位数。仰角 θ 的单位d,m,s为度、分和秒数,其中度、分为整数,秒数为小数。
输出描述:
h
注:h 的单位为米。
示例1
输入
27.8 1.2 2 32 48 59.5
输出
19.13
C语言:
#include<stdio.h> #include<math.h> #define pi 3.1415926535897932384626 int main(){ double a,b,s,k,sum; int c,m,d; scanf("%lf%lf%d",&a,&b,&c); scanf("%d%d%lf",&d,&m,&s); k=d+(double)m/60+s/3600; sum=a*tan(k*pi/180)+b; printf("%.*f",c,sum); }
Python:
暂无
咋一看就是简单的数学计算题,但是很多比赛选手却不知道数学函数怎么运用。用三角函数时请特别注意,需要角度转弧度的!本题中圆周率直接用已给的数值就行了。按照图中所示的数学关系建立等式,同时输出时注意下小数位数,这难不到你!
J题:三维弹球
大家都玩过三维弹球吧,现在有一个简化版的三维弹球。游戏开始时,弹球在一个正三角形中间,弹球有一个初速度,当弹球撞到墙壁(也就是三角形的边)时弹球会反弹(相当于光在镜面上的反射),且反弹后速度保持不变。和原版三维弹球不同的是,三面墙壁会以相同的速度沿墙壁的垂直方向前进(可以把墙壁想象成可以互相穿透的平面)。当三角形缩成一个点时,游戏结束。那么问题来了,当游戏结束时,弹球一共滚了多少米呢?
输入描述:
多组数据。每组第一行输入4个整数n,v1,v2,c(0<=n,v1,v2<=100,-180<=c<=180)表示三角形的边长,墙的移动速度(米/秒),弹球的初速度大小(米/秒),初速度与水平方向的夹角(度)。保证v1不等于0。
输出描述:
当游戏结束时,弹球滚动的距离(米),保留2位小数。
示例1
输入
1 1 1 45
输出
0.29
好了,现在是考验你的时候了,如果你能想出这道题来,说明你的数学功底相当不错了。现在给大家一个机会,让大家自己解出答案(能写出答案的我有奖品赠送),答案之后我再补充吧!