5.23C++蓝桥杯学习总结

这是第一次写博客,写得不好,请多指教~

前言

蓝桥杯试题学习day1


1.高斯的日记本

1.1原题呈现

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

1.2解决方法

法1:用excel数日期,从1777年开始手算;

法2:通过编程,按月份分类进行日期计数;

 1 //从出生年开始算起,这种题一般都要掐头去尾,我直接把头加上了,
 2 //出生第一天也算是活了一天,所以加119就行,
 3 
 4 #include<iostream>
 5 using namespace std;
 6 int month[13] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 7 int main()
 8 {
 9     int n;
10     while (cin >> n)
11     {
12         n += 119;
13         int year = 1777;
14         while (n >= 365)//算出n所在的年份
15         {
16             if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0)
17                 n -= 366;
18             else
19                 n -= 365;
20             year++;
21         }
22         int mon;
23         if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0)
24             month[1]++;//如果是闰年2月天数加一
25         for (mon = 0; mon <= 11; mon++)
26         {
27             if (n > month[mon])
28                 n -= month[mon];//因为可以有4.30,所以这里是>不是>=
29             else
30                 break;
31         }
32 
33         printf("%d-%02d-%02d", year, mon+1, n);     //注意输出格式
34     }
35     return 0;
36 }


1.3收获

巩固了暴力循环的方法,复习了闰年的判断方法(闰年是能够被4整除同时不能够被100整除的数或者是能够被400整除的数)


2.排他平方数

2.1原题呈现

小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
·6位正整数
·每个数位上的数字不同
·其平方数的每个数位不含原数字的任何组成数位

2.2解决方法

·个人做法:暴力枚举六位各不相同的相同的数(注意第一位不可以是0),通过取余数比较结果与原数的各位

·bi站课程做法:用STL,#include < sstream >,用string::find(),查找原数中是否有平方后数中的数。

·csdn上做法:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int vis[10];  //使用vis[j]保存i中数字j出现的次数
 6 
 7 bool judge(long long int i)    //判断i中是否有重复的数字
 8 {
 9     while (i)
10     {
11         if (vis[i % 10] == 0) //取i的最后一位数字,并保存其出现次数
12             vis[i % 10]++;
13         else                 //如果该数字已经出现过
14             return false;
15         i /= 10;    //判断下一个数字
16     }
17     return true;
18 }
19 bool judge1(long long int i)    //判断结果中是否包含i中的数字
20 {
21     while (i)
22     {
23         if (vis[i % 10] != 0)    //该数字已经在i中出现过
24             return false;        //返回错误
25         i /= 10;        //判断下一个数字
26     }
27     return true;
28 }
29 int main()
30 {
31     long long int i;
32     for (i = 123456; i <= 987654; i++)    //优化枚举范围
33     {
34         memset(vis, 0, sizeof(vis));
35         if (!judge(i))        //判断i中是否有重复数字
36             continue;    
37         if (!judge1(i*i))    //判断i的平方中是否包含i中的数字
38             continue;    
39         cout << i << endl;
40     }
41     return 0;
42 }

2.3收获

通过本例了解到了sstream库中的find()函数,能够比较方便地查找字符串中的元素。

总结

通过今天的学习,最主要是了解到STL中的字符串容器。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值