【蓝桥杯刷题训练营】day09、day10、day11、day12

day09

1 找素数

#include <iostream>
#include <cmath>
using namespace std;

bool isPrime(int num) {
//2, 3质数单独做讨论
  if(num == 2 || num == 3) return true;
//我们发现5以上的质数均在6两侧,但是注意6两侧的数不一定是质数
  if(num % 6 != 1 && num % 6 != 5) return false;
  for(int i = 5; i <= sqrt(num); i += 6) {
    if(num % i == 0 || num % (i+2) == 0)
      return false;
  }
  return true; 
}

int main() {
  int i = 2, cnt = 0;
  while(true) {
    if(isPrime(i)) cnt++;
    if(cnt == 100002) {
      cout << i << endl;
      break;
    }
    i++;
  }
  return 0;
}

2 图书排列

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int a,b,c,d,e,f,g,h,i,m;
  int count=0;
  for(a=1;a<11;a++){
    for(b=1;b<11;b++){
      for(c=1;c<11;c++){
        for(d=1;d<11;d++){
          for(e=1;e<11;e++){
            for(f=1;f<11;f++){
              for(g=1;g<11;g++){
                for(h=1;h<11;h++){
                  for(i=1;i<11;i++){
                    for(m=1;m<11;m++){
                       if(a+1!=b&&b+1!=c&&c+1!=d&&d+1!=e&&e+1!=f&&f+1!=g&&g+1!=h&&h+1!=i&&i+1!=m&&
                       a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&a!=m&&
                       b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&b!=m&&
                       c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&c!=m&&
                       d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&d!=m&&
                       e!=f&&e!=g&&e!=h&&e!=i&&e!=m&&
                       f!=g&&f!=h&&f!=i&&f!=m&&
                       g!=h&&g!=i&&g!=m&&
                       h!=i&&h!=m&&i!=m&&a-1!=b&&b-1!=c&&c-1!=d&&d-1!=e&&e-1!=f&&f-1!=g&&g-1!=h&&h-1!=i&&i-1!=m
                       ){
                            //printf("%d%d%d%d%d%d%d%d%d%d\n",a,b,c,d,e,f,g,h,i,m);
                         count++;
                        
                       }
                    
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  printf("%d",count);
  return 0;
}

只会采取暴力求解的方式,没有很好地思绪

day10

1. 剪裁纸

这道题还是很简单滴!

#include <iostream>
using namespace std;
int main()
{
  int n, m;
  //m表示行,n表示列
  scanf("%d%d",&m,&n);
printf("%d",4+(m-1)+((n-1)*m));
  return 0;
}

2. 刷题统计

#include <iostream>
#include <cmath>

using namespace std;
int main()
{
    long int week = 0;
    float day = 0;
    long long int n,wek = 0;
    int a, b;
    scanf("%lld %lld %lld",&a,&b,&n);

    //多少周
    week = n/(5*a+2*b);
    n %= (5*a+2*b);

    //n小于一周的题量
    if(n > 5*a) day = 5 + ceil(1.0*(n-5*a)/b);
    else day = ceil(1.0*n/a);

    printf("%lld",week*7 + (int)day);
    return 0;
}

day11

1. 卡片

#include <iostream>
using namespace std;

int main()
{
    long int i=0;
    long int sum = 2021,tmp=0;
    long int b=0;
    for(i=1; i<20210; i++) {
        //记住需要一个数把i的值给记下来,因为后面的相除那一个数是发生变化 
        tmp=i;
        while(tmp) {
            b = tmp%10;
            if(b==1 && sum>0) {
                sum-=1;
            }
            tmp/=10;
        }
        if (sum==0) {
            break;
        }
    }
    cout<<i;
    return 0;
}

因为1是排在最前面的,我们可以想出来1是最先进行消耗完毕的,所以我们只要记录下来1最后用尽的那一数是多少,我们可以使用一个while循环把1消耗进行记录下来,就是递减,出现1就递减1,等于0的时候就是我们需要的那一解

2. 路径

没有思绪,不知道咋写o(╥﹏╥)o

3. 字符统计

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i,j,k;
  char s[1000000];
  scanf("%s",s);
  int a[10000];
  for(i=0;s[i]!='\0';i++)
  {
    a[s[i]-'A']++;
  }
  k=0;
  for(i=0;i<26;i++)
  {
    if(k<a[i])
    {
      k=a[i];
    }
  }
  for(i=0;i<26;i++)
  {
    if(a[i]==k)
    {
      printf("%c",'A'+i);
    }
  }
  return 0;
}

day12

1. 0的个数

#include <iostream>
using namespace std;
int main()
{
  int n;
  cin>>n;
  int k=10,count=0;
  while(n%k==0)
  {
    n=n/k;
    count++;
  }
  cout<<count;
  return 0;
}

2. 超级质数

采用暴力求解的手段

#include<iostream>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
bool ju2(int x) {
  //判断质数
    if (x == 1)return 0;
    for (int i = 2; i <= x / i; i++) {
        if (x % i == 0)
            return 0;
    }
    return 1;
}
bool ju(string s) {
  //判断超级质数
    for (int i = 1; i <= s.length(); i++) {
        for (int j = 0; j <= s.length() - i; j++) {
            string sub = s.substr(j, i);
            int t = stoi(sub);
            if (!ju2(t))return 0;
        }
    }
    return 1;
}
int main() {
    for (int i = 1; i < 1000000000; i++) {
        string ss = to_string(i);
        if (ju(ss))
            cout << ss << endl;
    }
    return 0;
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值