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

简介: 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791 年 12 月 15 日。高斯获得博士学位的那天日记上标着:8113。

高斯日记


题目:


大数学家高斯有个好习惯:无论如何都要记日记。


他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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


a22dd26803674359b1aa9ee4760d196d.png


马虎的算式


题目:


小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。


有一次,老师出的题目是: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;
}


结果:


30161521b5554108b35ba1b89d66d416.png


第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;
}


结果:


37c641aa91994400b25b02479ea1d4e6.png


总结


以上就是今天的学习内容啦~

如果有兴趣的话可以订阅专栏,持续更新呢~

咱们下期再见~


120c80f6b1ef4271b915f2ea12d9316e.gif

相关文章
|
5月前
|
算法 C语言
C语言实现青蛙跳台阶问题
C语言实现青蛙跳台阶问题
55 5
|
5月前
|
算法 C语言
C语言——oj刷题——回文字符串
C语言——oj刷题——回文字符串
27 2
|
5月前
|
算法 C语言
C语言——oj刷题——字符串左旋和轮转数组
C语言——oj刷题——字符串左旋和轮转数组
39 1
|
5月前
|
C语言
C语言——oj刷题——调整数组使奇数全部都位于偶数前面
C语言——oj刷题——调整数组使奇数全部都位于偶数前面
35 1
|
5月前
|
C语言
C语言——oj刷题——猜数字游戏
C语言——oj刷题——猜数字游戏
24 0
|
5月前
|
编译器 C语言
C语言——oj刷题——判断闰年
C语言——oj刷题——判断闰年
62 0
|
5月前
|
C语言
C语言——oj刷题——找单身狗1
C语言——oj刷题——找单身狗1
33 0
|
5月前
|
C语言
C语言——oj刷题——找单身狗2
C语言——oj刷题——找单身狗2
37 0
|
5月前
|
算法 C语言
C语言——oj刷题——杨氏矩阵
C语言——oj刷题——杨氏矩阵
42 0
|
5月前
|
C语言
C语言——oj刷题——获取月份天数
C语言——oj刷题——获取月份天数
62 0