本题解分为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

好了,现在是考验你的时候了,如果你能想出这道题来,说明你的数学功底相当不错了。现在给大家一个机会,让大家自己解出答案(能写出答案的我有奖品赠送),答案之后我再补充吧!