蓝桥杯在线测试的题解(一)
新手推荐,蓝桥杯在线测试的题目。不定时不断更新中,没按顺序做。无聊的时候来切几题。
http://lx.lanqiao.org/index.page
已转到http://blog.csdn.net/murmured/article/details/19292147进行更新,因为保存很慢。
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
#include<cstdio> const int mod=10007; const int MAXN=1000000+10; int ans[MAXN]; int main() { ans[1]=ans[2]=1; int n; scanf("%d",&n); for(int i=3;i<=n;i++) ans[i]=(ans[i-1]+ans[i-2])%mod; printf("%d\n",ans[n]); return 0; }
给定圆的半径r,求圆的面积。
#include<cstdio> #include<cmath> const double pi=acos(-1.0); int main() { double r; scanf("%lf",&r); printf("%.7lf\n",pi*r*r); return 0; }
求1+2+3+...+n的值。
#include<cstdio> int main() { __int64 n; scanf("%I64d",&n); __int64 ans=(1+n)*n >>1; printf("%I64d\n",ans); return 0; }
算a+b
#include <cstdio> int main() { int a, b; scanf("%d%d", &a, &b); printf("%d", a+b); return 0; }
#include <cstdio> #include<algorithm> using namespace std; const int MAXN=200+10; int a[MAXN]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); printf("%d",a[0]); for(int i=1;i<n;i++) printf(" %d",a[i]); printf("\n"); return 0; }
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
#include <cstdio> const int MAXN=10000+10; int x[MAXN]; int main() { int n,a; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x[i]); scanf("%d",&a); int ans=-1; for(int i=1;i<=n;i++) if(x[i]==a) { ans=i; break; } printf("%d\n",ans); return 0; }
闰年判断
#include <cstdio> int main() { int n; scanf("%d",&n); if(n %4==0 && n%100!=0 || n%400==0) printf("yes\n"); else printf("no\n"); return 0; }
给定n个十六进制正整数,输出它们对应的八进制数。
思路:先将十六进制转为4位2进制,然后八进制可以从2进制的每3位得到。
#include<cstdio> #include<cstring> const int MAXN=100000; char s[MAXN]; char two[MAXN*4]; int eight[MAXN*4]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",s); int n=strlen(s),len=0; for(int i=0;i<n;i++) { switch(s[i]) { case '0':sprintf(two+len,"%s","0000");break; case '1':sprintf(two+len,"%s","0001");break; case '2':sprintf(two+len,"%s","0010");break; case '3':sprintf(two+len,"%s","0011");break; case '4':sprintf(two+len,"%s","0100");break; case '5':sprintf(two+len,"%s","0101");break; case '6':sprintf(two+len,"%s","0110");break; case '7':sprintf(two+len,"%s","0111");break; case '8':sprintf(two+len,"%s","1000");break; case '9':sprintf(two+len,"%s","1001");break; case 'A':sprintf(two+len,"%s","1010");break; case 'B':sprintf(two+len,"%s","1011");break; case 'C':sprintf(two+len,"%s","1100");break; case 'D':sprintf(two+len,"%s","1101");break; case 'E':sprintf(two+len,"%s","1110");break; case 'F':sprintf(two+len,"%s","1111");break; } len+=4; } // for(int i=0;i<len;i+=4) // printf("%c%c%c%c ",two[i],two[i+1],two[i+2],two[i+3]); int i=len-1,len2=0; for(i=len-1;i>=2;i-=3) { eight[len2++]= two[i]-'0'+(two[i-1]-'0')*2+(two[i-2]-'0')*4; } if(i==2) eight[len2++]= two[i]-'0'+(two[i-1]-'0')*2+(two[i-2]-'0')*4; else if(i==1) eight[len2++]= two[i]-'0'+(two[i-1]-'0')*2; else if(i==0) eight[len2++]= two[i]-'0'; i=len2-1; while(eight[i]==0) i--; for(;i>=0;i--) printf("%d",eight[i]); printf("\n"); } return 0; }
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
思路:按权展开,注意范围 8个F的时候int越界。
#include<cstdio> #include<cstring> const int MAXN=10; char s[MAXN]; int main() { while(~scanf("%s",s)) { int n=strlen(s); __int64 ans=0,p=16; for(int i=0;i<n;i++) { if(s[i]>='0' && s[i]<='9') ans=ans*p+(s[i]-'0'); else ans=ans*p+(s[i]-'A'+10); } printf("%I64d\n",ans); } return 0; }
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
#include<cstdio> #include<cstring> char s[10]; int main() { int n; scanf("%d",&n); for(int i=10000;i<1000000;i++) { sprintf(s,"%d",i); int len=strlen(s); bool ok=true; for(int k=0;k<3;k++) if(s[k]!=s[len-k-1]) ok=false; if(ok) { int sum=0; for(int k=0;k<len;k++) sum+=s[k]-'0'; if(sum==n) printf("%s\n",s); } } return 0; }
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
#include<cstdio> #include<cstring> char s[10]; int main() { for(int i=1000;i<10000;i++) { sprintf(s,"%d",i); int len=strlen(s); bool ok=true; for(int k=0;k<3;k++) if(s[k]!=s[len-k-1]) ok=false; if(ok) { printf("%s\n",s); } } return 0; }
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数
#include<cstdio> #include<cstring> char s[10]; int main() { for(int i=100;i<1000;i++) { sprintf(s,"%d",i); int sum=0; for(int k=0;k<3;k++) { int x=s[k]-'0'; sum+=x*x*x; } if(sum==i) printf("%d\n",i); } return 0; }
给出n个数,找出这n个数的最大值,最小值,和。
PS:题目的样例错了。和为11
#include<cstdio> const int INF=10000+10; int main() { int n,min=INF,max=-INF,sum=0,temp; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&temp); sum+=temp; if(max <temp) max=temp; if(min >temp) min=temp; } printf("%d\n%d\n%d\n",max,min,sum); return 0; }
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
#include<cstdio> int ans[30]={0}; int main() { int a; scanf("%d",&a); int len=0; while(a) { ans[len++]=a % 16; a/=16; } while(ans[len]==0 && len>=0) len--; if(len>=0) for(int i=len;i>=0;i--) { if(ans[i] > 9) printf("%c",ans[i]-10+'A'); else printf("%d",ans[i]); } else printf("0"); printf("\n"); return 0; }
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
#include<cstdio> int ans[36][36]={0}; int main() { ans[1][1]=1; for(int i=2;i<=34;i++) { for(int j=1;j<=i;j++) { ans[i][j]=ans[i-1][j]+ans[i-1][j-1]; } } int n; scanf("%d",&n); for(int i=1;i<=n;i++) { printf("%d",ans[i][1]); for(int j=2;j<=i;j++) { printf(" %d",ans[i][j]); } printf("\n"); } return 0; }
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
#include<cstdio> char ans[30][30]; int main() { for(int i=1;i<=26;i++) ans[i][1]=ans[1][i]=i+'A'-1; for(int i=1;i<=26;i++) { for(int j=1;j<=26;j++) ans[i+1][j+1]=ans[i][j]; } int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { printf("%c",ans[i][j]); } printf("\n"); } return 0; }
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
#include<cstdio> int main() { for(int a=0;a<2;a++) for(int b=0;b<2;b++) for(int c=0;c<2;c++) for(int d=0;d<2;d++) for(int e=0;e<2;e++) printf("%d%d%d%d%d\n",a,b,c,d,e); return 0; }