蓝桥杯练习系统题解
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; }