高斯日记
题目:
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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; }
结果:
总结
以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~