蓝桥杯在线测试的题解(一)

新手推荐,蓝桥杯在线测试的题目。不定时不断更新中,没按顺序做。无聊的时候来切几题。

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;
}



posted @ 2014-02-03 10:12  hr_whisper  阅读(404)  评论(0编辑  收藏  举报