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


高斯日记

题目:
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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天
#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;
}

结果:
在这里插入图片描述


总结

以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_55394328/article/details/129212246
今日推荐