文章目录
- 高斯日记
- 马虎的算式
- 第39级台阶
- 总结
高斯日记
题目:
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777 年 4 月 30 日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791 年 12 月 15 日。
高斯获得博士学位的那天日记上标着:8113。
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy−mm−dd, 例如:1980−03−21。
解题思路:
这题采用“翻日历”的思路去解,也就是枚举。
- 先定义年月日,然后进行循环。
- 如果月份是12月,则日为31,翻过去后,日是32,那么就翻到下一年,此时年份加1,月日为1
- 如果月份是1、3、5、7、8、10,则日为31,翻过去后,日为32,那么就翻到下一个月,此时月份加1,日为1
- 如果月份是4、6、9、11, 则日为30,翻过去后,日为31,那么就翻到下一个月,此时月份加1,日为1
- 如果月份是2月,则要判断当年是否为闰年,如果为闰年,则为29天,否则是28天
#include <stdio.h>
//判断是否为闰年
bool isLeapyear(int y) {
return (y%4 == 0 && y%100 !=0) || (y %400 ==0);
}
int main() {
int y = 1777;
int m = 4;
int d = 30;
for(int i = 0; i<8112; ++i) {
d++;
// 如果月份是12月,则日为31,翻过去后,日是32,那么就翻到下一年,此时年份加1,月日为1
if(m == 12 && d ==32) {
y++;
m = 1;
d = 1;
continue;
}
// 如果月份是1、3、5、7、8、10,则日为31,翻过去后,日为32,那么就翻到下一个月,此时月份加1,日为1
if((m == 1 ||m == 3||m==5 || m ==7 || m==8 || m==10) && d ==32) {
m++;
d=1;
continue;
}
// 如果月份是4、6、9、11, 则日为30,翻过去后,日为31,那么就翻到下一个月,此时月份加1,日为1
if((m==4 || m==6 || m==9 || m==11) && d == 31) {
m++;
d=1;
continue;
}
// 如果月份是2月,则要判断当年是否为闰年,如果为闰年,则为29天,否则是28天
if(m==2 && isLeapyear(y) && d == 30) {
m++;
d = 1;
continue;
}
if(m==2 && !isLeapyear(y) && d == 29) {
m++;
d = 1;
continue;
}
}
printf("%d-0%d-%d",y,m,d);
return 0;
}
==结果:==我们可以先使用样例来验证代码是否正确,最后得出结果是1799-07-16
马虎的算式
题目:
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36x495=?
他却给抄成了:396x45=?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36∗495=396∗45=17820。
类似这样的巧合情况可能还有很多,比如:27∗594=297∗54。
假设 a b c d e 代表 1 ~ 9 不同的 5 个数字(注意是各不相同的数字,且不含 0 )
能满足形如: ab∗cde=adb∗ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
思路:
这题是一个简单的枚举,需要注意abcde各不相同,
所以在枚举中要先进行判断才能进入下一个for循环。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
#include <stdio.h>
int main(){
int cnt;
for(int a = 1;a<10;a++){
for(int b=1;b<10;b++){
if(a!=b){
for(int c = 1;c<10;c++){
if(c!=a && c!=b){
for(int d = 1;d<10;d++){
if(d!=a && d!=b && d!=c){
for(int e = 1;e<10;e++){
if(e!=a && e!=b && e!=c && e!=d){
if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e)){
cnt++;
}
}
}
}
}
}
}
}
}
}
printf("%d",cnt);
return 0;
}
结果:
第39级台阶
题目:
小明刚刚看完电影《第 39 级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是 39 级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上 1 个或 2 个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完 39 级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
思路:
注意:一共要走偶数步。
#include <stdio.h>
#include <stdlib.h>
//定义一个全局变量ans,表示上法的和
int ans;
//n为剩下的阶梯数,step为已经走的步数
void way(int n,int step) {
if(n <0) {
return;
}
if(n == 0 && step%2 ==0) {
ans++;
return;
}
way(n-1,step+1);
way(n-2,step+1);
}
int main() {
way(39,0);
printf("%d\n",ans);
return 0;
}
结果:
总结
以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~