前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【蓝桥OJ—C语言】高斯日记、马虎的算式、第39级台阶

【蓝桥OJ—C语言】高斯日记、马虎的算式、第39级台阶

作者头像
颜颜yan_
发布2023-02-26 15:11:15
5760
发布2023-02-26 15:11:15
举报
文章被收录于专栏:颜颜yan_的学习笔记

文章目录


高斯日记

题目: 大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777 年 4 月 30 日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791 年 12 月 15 日。 高斯获得博士学位的那天日记上标着:8113。 请你算出高斯获得博士学位的年月日。 提交答案的格式是:yyyy−mm−dd, 例如:1980−03−21。 解题思路: 这题采用“翻日历”的思路去解,也就是枚举。

  1. 先定义年月日,然后进行循环。
  2. 如果月份是12月,则日为31,翻过去后,日是32,那么就翻到下一年,此时年份加1,月日为1
  3. 如果月份是1、3、5、7、8、10,则日为31,翻过去后,日为32,那么就翻到下一个月,此时月份加1,日为1
  4. 如果月份是4、6、9、11, 则日为30,翻过去后,日为31,那么就翻到下一个月,此时月份加1,日为1
  5. 如果月份是2月,则要判断当年是否为闰年,如果为闰年,则为29天,否则是28天
代码语言:javascript
复制
#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循环。 满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

代码语言:javascript
复制
#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 级台阶,有多少种不同的上法呢? 请你利用计算机的优势,帮助小明寻找答案。 思路: 注意:一共要走偶数步。

代码语言:javascript
复制
#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;
}

结果:


总结

以上就是今天的学习内容啦~ 咱们下期再见~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 高斯日记
  • 马虎的算式
  • 第39级台阶
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档