蓝桥杯在线测试的题解
2014-02-04 15:27
441 查看
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
[cpp] view
plaincopy
#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
);
return 0;
}
给定圆的半径r,求圆的面积。
[cpp] view
plaincopy
#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的值。
[cpp] view
plaincopy
#include<cstdio>
int main()
{
__int64 n;
scanf("%I64d",&n);
__int64 ans=(1+n)*n >>1;
printf("%I64d\n",ans);
return 0;
}
算a+b
[cpp] view
plaincopy
#include <cstdio>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a+b);
return 0;
}
排序
[cpp] view
plaincopy
#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在数列中的第一次出现是第几个。
[cpp] view
plaincopy
#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;
}
闰年判断
[cpp] view
plaincopy
#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位得到。
[cpp] view
plaincopy
#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越界。
[cpp] view
plaincopy
#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 。
[cpp] view
plaincopy
#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是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
[cpp] view
plaincopy
#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。编程求所有满足这种条件的三位十进制数
[cpp] view
plaincopy
#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
[cpp] view
plaincopy
#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;
}
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
[cpp] view
plaincopy
#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
);
return 0;
}
给定圆的半径r,求圆的面积。
[cpp] view
plaincopy
#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的值。
[cpp] view
plaincopy
#include<cstdio>
int main()
{
__int64 n;
scanf("%I64d",&n);
__int64 ans=(1+n)*n >>1;
printf("%I64d\n",ans);
return 0;
}
算a+b
[cpp] view
plaincopy
#include <cstdio>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a+b);
return 0;
}
排序
[cpp] view
plaincopy
#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在数列中的第一次出现是第几个。
[cpp] view
plaincopy
#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;
}
闰年判断
[cpp] view
plaincopy
#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位得到。
[cpp] view
plaincopy
#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越界。
[cpp] view
plaincopy
#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 。
[cpp] view
plaincopy
#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是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
[cpp] view
plaincopy
#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。编程求所有满足这种条件的三位十进制数
[cpp] view
plaincopy
#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
[cpp] view
plaincopy
#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;
}
相关文章推荐
- C# Common Keyword
- 励志---决定你一生成就的21个信念及要点
- fckeditor编辑器的使用
- R语言字符串函数
- 使用图形界面调试arm程序: insight + gdb
- 正式在CSDN开博
- XMLPULL解析(2)---通过对象序列化生成XML文档
- UVA 424和10106的个人体会
- POJ 2486 经典树形dp
- LockDemo
- 安装debian linux后的优化配置
- Linux内核编译,模块尺寸变大的解决办法
- 程序员必看的那些电影
- Initialising Memories
- tomcat的一些设置
- java学习之面试题3
- SPOJ 220 Relevant Phrases of Annihilation(后缀数组)
- 2014学习计划
- 【C++学习】迭代器的使用:vector的操作---ShinePans
- Uml 9种图 之 行为描述 之活动图和状态图