准本蓝桥杯时的一些收获

准本蓝桥杯时的一些收获

1.c++中string的size()和length():

length是因为沿用C语言习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便于STL的算法。

2.中文字符在char[]中的存储方式?

在中文windows操作系统下,中文默认是采用BGK字符集,每个字符占16bit(2字节)。

C语言规定char类型的具体实现至少8bit。一般gcc等编译器都将char类型实现为8bit(1字节)。

在中文Windows下,一般使用C语言的内置char类型的数组,就可以存储中文了。比如char[2]可以存储一个中文。
char ch[11] = “我来测试的”;//5个汉字*2字节/汉字=10字节,再加一个’\0’结尾符,一共需11字节

注:for(int i = 0; i < 11; i ++) cout<<ch[i]; //这条语句的运行结果是:

1558155790622

3.闰年的判断方法

if( (y % 4 == 0) || (y % 100 != 0 && y % 400 == 0)) 
    cout<<y<<"是闰年"<<endl;
else 
    cout<<y<<"是闰年"<<endl;

4.next_permutation(a+1,a+n+1)

do{
  	 if(check()) ans ++;
}while(next_permutation(a+1,a+n+1));

5.斐波那契数列

斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144……

依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。2是第3个斐波那契数。这个级数与大自然植物的关系极为密切。几乎所有花朵的花瓣数都来自这个级数中的一项数字:菠萝表皮方块形鳞苞形成两组旋向相反的螺线,它们的条数必须是这个级数中紧邻的两个数字(如左旋8行,右旋13行);还有向日葵花盘……倘若两组螺线条数完全相同,岂不更加严格对称?可大自然偏不!直到最近的1993年,人们才对这个古老而重要的级数给出真正满意的解释:此级数中任何相邻的两个数,次第相除,其比率都最为接近0.618034……这个值,它的极限就是所谓的黄金分割数

斐波那契数列的个位数:一个60步的循环

11235,83145,94370,77415,61785.38190,

99875,27965,16730,33695,49325,72910…

进一步,斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环。

6.拓展欧几里得算法

void gcd(int a, int b, int& d, int& x, int &y){
    if(!b){
        d = a; x = 1; y = 0;
    }
    else{
        gcd(b,a%b,d,y,x);
        y -= x*(a/b);
    } 
}

7.完全平方数

  1. 除 1 外,一个完全平方数分解质因数后,各个质因数的指数都是偶数,如果一个数质分解后, 各个指数都为偶数, 那么它肯定是个平方数。 完全平方数的所有因数的总个数是奇数个。因数个数为奇数的自然数一定是完全平方数。
  2. 一个正整数n是完全平方数的充分必要条件是n有奇数个因数(包括1和n本身)。
  3. 两个连续自然数的乘积一定不是平方数,两个连续自然数的平方数之间不再有平方数。

蓝桥杯第四届省赛_09

  1. 1799-7-16
    代码:
  #include<bits/stdc++.h>
     using namespace std;
  
  int y;
  int m;
  int d;
  
  int x[14] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  
  int isRun()
  {
      if(y%4 == 0 || (y%400!=0&&y%100==0)){
          return 1;
      }
      else return 0;
  }
  
  
  
  void nextDay()
  {
      d ++;
      if(m == 2 && d - 1 == x[m] + isRun() || m != 2 && d - 1 == x[m]){
          d = 1;
          if(++m == 13){
              m = 1;
              y ++;
          }
      }
  }
  
  
  
  int main()
  {
      //freopen("data.c", "r", stdin);
      y = 1777;
      m = 4;
      d = 30;
      for(int i = 1; i < 8113; i ++) nextDay();
      cout<<y<<"-"<<m<<"-"<<d<<endl;
      return 0;
  }
  1. 142
  2. #include<bits/stdc++.h>
     using namespace std;
  
  bool check(int a, int b, int c, int d, int e)
  {
      if(a == b) return false;
      if(a == c) return false;
      if(a == d) return false;
      if(a == e) return false;
      if(b == c) return false;
      if(b == d) return false;
      if(b == e) return false;
      if(c == d) return false;
      if(c == e) return false;
      if(d == e) return false;
      return true;
  }
  
  int main()
  {
      int ans = 0;
      for(int a = 1; a <= 9;  a ++){
          for(int b = 1; b <= 9; b ++){
              for(int c = 1; c <= 9; c ++){
                  for(int d = 1; d <= 9; d ++){
                      for(int e = 1; e <= 9; e ++){
                          if(check(a,b,c,d,e) == false) continue;
                          if( (a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e)) ans ++;
                      }
                  }
              }
          }
      }
      cout<<ans<<endl;
      return 0;
  }
  1. 51167078
#include<bits/stdc++.h>
using namespace std;

int dp[40][2];

int main()
{
    dp[0][0] = 1;
    for(int i = 1; i <= 39; i ++){
        dp[i][1] = dp[i-1][0] + dp[i-2][0];
        dp[i][0] = dp[i-1][1] + dp[i-2][1];
    }
    cout<<dp[39][0]<<endl;
    return 0;
}

斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144……

依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。2是第3个斐波那契数。这个级数与大自然植物的关系极为密切。几乎所有花朵的花瓣数都来自这个级数中的一项数字:菠萝表皮方块形鳞苞形成两组旋向相反的螺线,它们的条数必须是这个级数中紧邻的两个数字(如左旋8行,右旋13行);还有向日葵花盘……倘若两组螺线条数完全相同,岂不更加严格对称?可大自然偏不!直到最近的1993年,人们才对这个古老而重要的级数给出真正满意的解释:此级数中任何相邻的两个数,次第相除,其比率都最为接近0.618034……这个值,它的极限就是所谓的黄金分割数

斐波那契数列的个位数:一个60步的循环

11235,83145,94370,77415,61785.38190,

99875,27965,16730,33695,49325,72910…

进一步,斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环。

  1. *haystack != *needle

  2. p++

  3. 错误票据

  4. 题目标题:翻硬币

  5. 带分数

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    int a[10];
    int vis[10];
    int ans = 0;
    
    
    int num(int i, int j)
    {
        int ret = 0;
        for(int k = i; k <= j; k ++){
            ret = ret * 10 + a[k];
        }
        return ret;
    }
    
    
    void check()
    {
        for(int i = 1; i <= 8; i ++){
            for(int j = i + 1; j <= 8; j ++){
                int aa = num(1,i);
                int bb = num(i+1,j);
                int cc = num(j+1,9);
                if(bb%cc==0){
                    if(aa + bb/cc == n){
                        ans ++;
                    }
                }
            }
        }
    }
    
    void dfs(int cur)
    {
        if(cur > 9){
            check();
            return ;
        }
        else{
            for(int i = 1; i <= 9; i ++){
                if(vis[i] == 0){
                    vis[i] = 1;
                    a[cur] = i;
                    dfs(cur+1);
                    vis[i] = 0;
                }
            }
        }
    
    }
    
    
    int main()
    {
        while(cin>>n){
            ans = 0;
            dfs(1);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    10.连号区间数

    #include<bits/stdc++.h>
    using namespace std;
    int ans,n;
    int a[50005];
    
    int main()
    {
        while(cin>>n){
            ans = 0;
            for(int i = 1; i <= n; i ++) cin>>a[i];
            for(int i = 1; i <= n; i ++){
                int mini = a[i];
                int maxi = a[i];
                ans ++;
                for(int j = i + 1; j <= n; j ++){
                    if(mini > a[j]) mini = a[j];
                    if(maxi < a[j]) maxi = a[j];
                    if(j-i == maxi-mini) ans ++;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值