蓝桥杯练习系统题解

Posted wgwyanfs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯练习系统题解相关的知识,希望对你有一定的参考价值。

转于:http://www.cnblogs.com/cshhr/p/3550014.html



蓝桥杯官网练习系统题解(非VIP)


BEGIN-4(Fibonacci数列)

有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好

这里给一份另类代码,用矩阵高速幂求,事实上还有循环节

复制代码
/*
    (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧
    (1 0)   (Fn-2)   (Fn-1)

    (1 1) * (1 1) * (Fn-2) = ( Fn )
    (1 0)   (1 0)   (Fn-3)   (Fn-1)

    F1=1,F0=0...

    (1 1) * ... * (1 1) * (1) = ( Fn )//共n-1个(1 1)
    (1 0)         (1 0)   (0)   (Fn-1)         (1 0)
*/ 
#include<cstdio>
const int Mod=10007;
int Z[2][2];
void Matrix_Multiply(int X[][2],int Y[][2]){
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            Z[i][j]=0;
            for(int k=0;k<2;k++)
                Z[i][j]+=X[i][k]*Y[k][j];
        }
    }
}
void Matrix_Copy(int *C){
    for(int i=0;i<2*2;i++)
        C[i]=Z[i/2][i%2]%Mod;
}
int Fast(int n){//高速求幂
    int B[2][2]={1,0,0,1,},A[2][2]={1,1,1,0};//B为单位矩阵
    while(n){
        if(n&1){
            Matrix_Multiply(B,A);
            Matrix_Copy(&B[0][0]);
        }
        n>>=1;
        Matrix_Multiply(A,A);
        Matrix_Copy(&A[0][0]);
    }
    return B[0][0];//B[0][0]*f1+B[0][1]*f0 (f1=1,f0=0)
}
int main()
{
    int n;
    scanf("%d",&n);
    n=(n-1)%20016+1;//实验发现循环节为20016,事实上在使用高速幂的情况下这个优化快不了多少
    printf("%d\\n",Fast(n-1));
    return 0;
}
复制代码

 

BASIC-1(闰年推断)

复制代码
#include<cstdio>
bool Is(int y){
    if(y%4)return false;
    if(y%100)return true;
    if(y%400)return false;
    return true;
}
int main()
{
    int y;
    scanf("%d",&y);
    printf("%s\\n",Is(y)?

"yes":"no"); return 0; }

复制代码


BASIC-2(01字串)

回溯就好

复制代码
#include<cstdio>
#define MAXN 5
int ans[MAXN];
void Print_ans(int k){
    for(int i=0;i<k;i++)printf("%d",ans[i]);printf("\\n");
}
void Set_01(int k){
    if(k==MAXN){
        Print_ans(k);
        return;
    }
    for(int i=0;i<2;i++){
        ans[k]=i;
        Set_01(k+1);
    }
}
int main()
{
    Set_01(0);
    return 0;
}
复制代码

BASIC-3(字母图形)

复制代码
#include<cstdio>
int main()
{
    char ans[26][26];
    for(int i=0;i<26;i++){//这样把最大图案存好就不会错了,黑黑 
        ans[i][i]=\'A\';
        for(int j=i+1;j<26;j++)
            ans[i][j]=ans[j][i]=\'A\'+j-i;
    }
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++)
            printf("%c",ans[i][j]);
        printf("\\n");
    }
    return 0;
}
复制代码

BASIC-4(数列特征)

懒得思考了。最大最小值 直接存下标了

复制代码
int main()
{
    int minid,maxid,sum,n,a[10010];
    minid=maxid=sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(a[i]>a[maxid])maxid=i;
        if(a[i]<a[minid])minid=i;
        sum+=a[i];
    }
    printf("%d\\n%d\\n%d\\n",a[maxid],a[minid],sum);
    return 0;
}
复制代码

BASIC-5(查找整数)

每一个数都不大于10000,可在输入时储存每一个数字第一次出现的位置,后面的查找就变成了O(1)

复制代码
#include<cstdio>
int a[10010];
int main()
{
    int n,c;
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++){
        scanf("%d",&c);
        if(a[c]==0)a[c]=i;
    }
    printf("%d\\n",a[c]>n?

-1:a[c]);//这里a[c]>n表示c仅仅在最后输入查询值时出现过 return 0; }

复制代码

BASIC-6(杨辉三角形)

不多说了。注意格式就好

复制代码
#include<cstdio>
int main()
{
    int n,f[35][35];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        f[i][0]=f[i][i]=1;
        for(int j=1;j<i;j++)
            f[i][j]=f[i-1][j-1]+f[i-1][j];
        for(int j=0;j<i;j++)printf("%d ",f[i][j]);printf("%d\\n",f[i][i]);
    }
    return 0;
}
复制代码

BASIC-7(特殊的数字)

是不是非常逗

#include<cstdio>
int main()
{
    printf("153\\n370\\n371\\n407\\n");
    return 0;
}

BASIC-8(回文数)

还去写什么推断语句真是弱爆了

复制代码
#include<cstdio>
int main()
{
    for(int i=1;i<10;i++)
        for(int j=0;j<10;j++)
            printf("%d%d%d%d\\n",i,j,j,i);
    return 0;
}
复制代码

BASIC-9(特殊回文数)

两份代码。后者比前者快

复制代码
#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<10;i++)
        for(int j=0;j<10;j++){
            int k=n-i*2-j*2;
            if(k>=0 && k<10)
            printf("%d%d%d%d%d\\n",i,j,k,j,i);}
    if(n%2==0){
        n/=2;
        for(int i=1;i<10;i++)
            for(int j=0;j<10;j++){
                int k=n-i-j;
                if(k>=0 && k<10)
                printf("%d%d%d%d%d%d\\n",i,j,k,k,j,i);}
    }
    return 0;
}
复制代码
复制代码
#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n/2&&i<10;i++)
        for(int j=0;j<=n/2-i&&j<10;j++){
            int k=n-i*2-j*2;
            if(k<10)
            printf("%d%d%d%d%d\\n",i,j,k,j,i);}
    if(n%2==0){
        n/=2;
        for(int i=1;i<=n&&i<10;i++)
            for(int j=0;j<=n-i&&j<10;j++){
                int k=n-i-j;
                if(k<10)
                printf("%d%d%d%d%d%d\\n",i,j,k,k,j,i);}
    }
    return 0;
}