蓝桥杯刷题第八天

第一题:分数

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
1/1+1/2+1/4+1/8+⋯
每项是前一项的一半,如果一共有 20 项,求这个和是多少,结果用分数表示出来。
类似:3/2,当然,这只是加了前 2 项而已。分子分母要求互质。
运行限制
最大运行时间:1s
最大运行内存: 128M

就是模拟通分操作

从第一个数开始分子加上t,第二个数加上t / 2.....

#include
#include
using namespace std;

int main(){
  long long t = pow(2, 19);
  long long y = t;
  long long x = 0;
  while(t){
    x += t;
    t /= 2;
  }

  printf("%d/%d", x, y);
  return 0;
}

第二题:回文日期

题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
输入
20200202
输出
20211202
21211212

暴力枚举,检查日期是否合法,同时是否满足要求

#include 
using namespace std;

bool isleap(int year){
  return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

bool check(int year, int month, int day){
  if(month > 12 || month == 0) return false;
  if(day > 31) return false;
  if(month == 2){
    if(isleap(year) && day > 29)  return false;
    if(!isleap(year) && day > 28) return false;
  }
  if(month == 4 || month == 6 || month == 9 || month == 11)
    if(day > 30) return false;
  return true;
}

int main()
{
  int a, b, c, d, e, f, g, h, n;
  int year, month, day;
  scanf("%d", &n);

  int ans = 0, res = 0;
  for(int i = n ; i <= 99999999; i++){
    int year = i / 10000;
    int month = (i % 10000) / 100;
    int day = i % 100;
    a = i / 10000000;
    b = i / 1000000 % 10;
    c = i / 100000 % 10;
    d = i / 10000 % 10;
    e = i / 1000 % 10;
    f = i / 100 % 10;
    g = i / 10 % 10;
    h = i % 10;
    if(a == h && b == g && c == f && d == e)
      if(check(year, month, day) && ans == 0){
        ans = i;
      }
    if(a == h && b == g && c == f && d == e && a == c && f == h && b == d && e == g)
      if(check(year, month, day) && res == 0) {
        res = i;
      }
  }
  cout<

第三题:待更

第四题:斐波那契

题目描述
斐波那契数列大家都非常熟悉。它的定义是:
f(x)=1⋯(x=1,2)
f(x)=f(x−1)+f(x−2)⋯(x>2)
对于给定的整数 nm,我们希望求出:
f(1)+f(2)+⋯+f(n) 的值。但这个值可能非常大,所以我们把它对f(m) 取模。
公式如下:
(∑ i=1n f(i)modf(m))
但这个数字依然很大,所以需要再对 p 求模。
输入描述
输入描述
输入为一行用空格分开的整数 n,m,p (0<n,m,p<10的 18次方 )。
输出描述
输出为 1 个整数。
输入输出样例
输入
2 3 5
输出
0

过了57.1%, 用数组模拟操作,找出1到n的和,以及f(m),再取模

#include 
using namespace std;

typedef long long LL;
LL f[1000000];
LL n, m, p, sum;
int main()
{
  cin>>n>>m>>p;
  f[1] = 1;
  sum = 1;
  for(int i = 2;i <= n; i++){
    f[i] = f[i-1] + f[i-2];
    sum += f[i];
  } 
  if(m > n){
    for(int i = n + 1; i <= m ; i++){
    f[i] = f[i-1] + f[i-2];
    sum += f[i];
  }
  }
  cout<

你可能感兴趣的:(蓝桥杯集训,蓝桥杯,c++,算法)