蓝桥杯习题
目录
入门训练(详见 算法-蓝桥杯习题(1-1))Go
基础练习(详见 算法-蓝桥杯习题(2-1))Go
基础练习(详见 算法-蓝桥杯习题(2-2))Go
算法训练(详见 算法-蓝桥杯习题(3-1))Go
算法训练(详见 算法-蓝桥杯习题(3-2))Go
算法训练(详见 算法-蓝桥杯习题(3-3))Go
算法训练(详见 算法-蓝桥杯习题(3-4))Go
算法训练(详见 算法-蓝桥杯习题(3-5))Go
算法训练(详见 算法-蓝桥杯习题(3-6))Go
算法提高(详见 算法-蓝桥杯习题(4-1))Go
算法提高(详见 算法-蓝桥杯习题(4-2))Go
算法提高(详见 算法-蓝桥杯习题(4-3))Go
历届试题(详见 算法-蓝桥杯习题(5-1))Go
历届试题(详见 算法-蓝桥杯习题(5-2))Go
蓝桥杯练习系统评测数据
链接: https://pan.baidu.com/s/1brjjmwv
密码: iieq
算法训练(PartD-19题)
/*
算法训练 奇偶判断
问题描述
能被2整除的数称为偶数,不能被2整除的数称为奇数。给一个整数x,判断x是奇数还是偶数。
输入格式
输入包括一个整数x,0<=x<=100000000。
输出格式
如果x是奇数,则输出“odd”,如果是偶数,则输出“even”。
样例输入
10
样例输出
even
样例输入
2009
样例输出
odd
*/
#include <stdio.h>
main()
{
unsigned int x;
while(scanf("%d",&x)!=EOF)
{
if(x%2)
{
printf("odd\n");
}
else
{
printf("even\n");
}
}
return 0;
}
/*
算法训练 平方计算
问题描述
输入正整数a, m,输出a^2%m,其中^表示乘方,即a^2表示a的平方,%表示取余。
输入格式
输入包含两个整数a, m,a不超过10000。
输出格式
输出一个整数,即a^2%m的值。
样例输入
5 6
样例输出
1
*/
#include <stdio.h>
main()
{
unsigned int a,m;
scanf("%d%d",&a,&m);
printf("%d\n",a*a%m);
return 0;
}
/*
算法训练 乘法表
问题描述
输出九九乘法表。
输出格式
输出格式见下面的样例。乘号用“*”表示。
样例输出
下面给出输出的前几行:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
……
*/
#include <stdio.h>
main()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=1;j<i+1;j++)
{
printf("%d*%d=%d ",i,j,i*j);
}
printf("\n");
}
return 0;
}
/*
算法训练 大小写判断
问题描述
给定一个英文字母判断这个字母是大写还是小写。
输入格式
输入只包含一个英文字母c。
输出格式
如果c是大写字母,输出“upper”,否则输出“lower”。
样例输入
x
样例输出
lower
样例输入
B
样例输出
upper
*/
#include <stdio.h>
#include <string.h>
main()
{
char letter;
letter=getchar();
if(letter>='A'&&letter<='Z')
{
printf("upper\n");
}
if(letter>='a'&&letter<='z')
{
printf("lower\n");
}
else
{
}
return 0;
}
#include "iostream"
#include "string"
#include "stdio.h"
using namespace std;
const int N =1000;
bool bArrange[N][N];
int main()
{
int n;
cin>>n;
int row=(1<<n);
int volumn=1<<(n-1);
for(int i = 0; i< row-1 ; i++ )
{
cout<<"<"<<i+1<<">"<<"1-"<<i+2;
bool isArrage[N]={false};
isArrage[1]=isArrage[i+2]=true;
bArrange[1][i+2]=bArrange[i+2][1]=true;
for(int j =1 ; j< volumn ; j++)
{
int a;
for( a=2;a<=row;a++)
if(isArrage[a]==false)
break;
for(int b=a+1;b<=row;b++)
{
if(bArrange[a][b]==false&&isArrage[b]==false)
{
bArrange[a][b]=bArrange[b][a]=true;
isArrage[a]=isArrage[b]=true;
cout<<" "<<a<<"-"<<b;
break;
}
}
}
cout<<endl;
}
return 0;
}
/*
算法训练 字符串编辑
问题描述
从键盘输入一个字符串(长度<=40个字符),并以字符 ’.’ 结束。编辑功能有:1 D:删除一个字符,命令的方式为: D a 其中a为被删除的字符,例如:D s 表示删除字符 ’s’ ,若字符串中有多个 ‘s’,则删除第一次出现的。
2 I:插入一个字符,命令的格式为:I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符。例如:I s d 表示在指定字符 ’s’ 的前面插入字符 ‘d’ ,若原串中有多个 ‘s’ ,则插入在最后一个字符的前面。
3 R:替换一个字符,命令格式为:R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则应全部替换。
在编辑过程中,若出现被改的字符不存在时,则给出提示信息。
输入格式
输入文件stringedit.in共两行,第一行为原串(以’.’结束),第二行为命令(输入方式参见“问题描述” 。
输出格式
输出文件stringedit.out共一行,为修改后的字符串或输出指定字符不存在的提示信息。
样例输入
This is a book.
D s
样例输出
Thi is a book.
D s
输入输出样例解释
命令为删去s,第一个在字符中出现的s在This中,即得到结果。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuffer sb = new StringBuffer(sc.nextLine());
String s = sc.next();
if (s.equalsIgnoreCase("D")) {
String a = sc.next();
int l = sb.indexOf(a);
System.out.println(sb.deleteCharAt(l));
} else if (s.equalsIgnoreCase("I")) {
String a1 = sc.next();
String a2 = sc.next();
int l = sb.lastIndexOf(a1);
System.out.println(sb.insert(l, a2));
} else if (s.equalsIgnoreCase("R")) {
String a1 = sc.next();
String a2 = sc.next();
if (sb.indexOf(a1) == -1)
System.out.println("\u6307\u5b9a\u5b57\u7b26\u4e0d\u5b58\u5728");
else
System.out.println(sb.toString().replace(a1, a2));
}
}
}
/*
//此答案错误,当时用取巧的方式做的,答案也和测试数据一样,但不知错哪了(用循环链表构建字符串试试)
#include <stdio.h>
#include <string.h>
#define MaxSize 45
void printDelectResult(char *str,char letter)
{
int i=0,st=0,sp=0;
while(str[i]!='.')
{
if(!st&&str[i]==letter)
{
st=1;
}
if(!sp&&st)
{
i++;
if(str[i]=='.')
break;
sp=1;
}
printf("%c",str[i]);
i++;
}
printf(".\n");
return ;
}
void printInsertResult(char *str,char a1,char a2)
{
int i=0,k=0;
while(str[i]!='.')
{
i++;
if(str[i]==a1)
{
k=i;
}
}
i=0;
while(str[i]!='.')
{
if(i==k)
{
putchar(a2);
}
putchar(str[i]);
i++;
}
printf(".\n");
return ;
}
void printReplaceResult(char *str,char a1,char a2)
{
int i=0;
while(str[i]!='.')
{
if(str[i]==a1)
{
putchar(a2);
}
else
{
putchar(str[i]);
}
i++;
}
printf(".\n");
return ;
}
main()
{
char str[MaxSize],T,a1,a2;
int i=0,j;
str[i]=getchar();
while(str[i]!='.')
{
i++;
str[i]=getchar();
}
T=getchar();
getchar();//接收空格键
if(T=='D'||T=='d')
{
a1=getchar();
printDelectResult(str,a1);
}
else if(T=='I'||T=='i')
{
a1=getchar();
getchar();//接收空格键
a2=getchar();
printInsertResult(str,a1,a2);
}
else if(T=='R'||T=='r')
{
a1=getchar();
getchar();//接收空格键
a2=getchar();
printReplaceResult(str,a1,a2);
}
return 0;
}
*/
/*
算法训练 最大值与最小值的计算
时间限制:1.0s 内存限制:512.0MB
输入11个整数,计算它们的最大值和最小值。
样例输入
0 1 2 3 4 5 6 7 8 9 10
样例输出
10 0
*/
#include<stdio.h>
int main()
{
int n;
int a[11],i1,max=-234234,min=93759347;
for(i1=0;i1<11;i1++)
{
scanf("%d",&a[i1]);
if(max<a[i1])
max=a[i1];
if(min>a[i1])
min=a[i1];
}
printf("%d %d\n",max,min);
return 0;
}
/*
算法训练 判定数字
时间限制:1.0s 内存限制:512.0MB
编写函数,判断某个给定字符是否为数字。
样例输入
9
样例输出
yes
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char x;
scanf("%c",&x);
if('0'<=x&&x<='9')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
/*
算法训练 字符串逆序
时间限制:1.0s 内存限制:512.0MB
输入一个字符串,长度在100以内,按相反次序输出其中的所有字符。
样例输入
tsinghua
样例输出
auhgnist
*/
#include <stdio.h>
#include <string.h>
#define MaxSize 100
int main()
{
char str[MaxSize];
int lenth;
gets(str);
lenth=strlen(str);
while(lenth--)
{
putchar(str[lenth]);
}
printf("\n");
return 0;
}
/*
算法训练 最长字符串
时间限制:1.0s 内存限制:512.0MB
求出5个字符串中最长的字符串。每个字符串长度在100以内,且全为小写字母。
样例输入
one two three four five
样例输出
three
*/
#include<stdio.h>
#include<string.h>
int main()
{
char str[5][100];
int len[5];
int i,j,t,max;
max=0;
for(i=0;i<5;i++)
{
scanf("%s",str[i]);
len[i]=strlen(str[i]);
if(len[i]>max)
{
max=len[i];
t=i;
}
}
puts(str[t]);
return 0;
}
/*
算法训练 比较字符串
编程实现两个字符串s1和s2的字典序比较。(保证每一个字符串不是另一个的前缀,且长度在100以内)。若s1和s2相等,输出0;若它们不相等,则指出其第一个不同字符的ASCII码的差值:如果s1>s2,则差值为正;如果s1<s2,则差值为负。
样例输入
java basic
样例输出
8
*/
#include<stdio.h>
#include<string.h>
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
char a[1000];
char b[1000];
scanf("%s",a);
scanf("%s",b);
int k=min(strlen(a),strlen(b)),i1;
int ok=1;
for(i1=0;i1<k;i1++)
{ if(a[i1]!=b[i1])
{ printf("%d\n",a[i1]-b[i1]);
ok=0;
break;
}
}
if(ok==1)
if(strlen(a)==strlen(b))
printf("0\n");
else if(strlen(a)>strlen(b))
printf("%d\n",a[i1]);
else
printf("%d\n",b[i1]);
return 0;
}
/*
算法训练 成绩的等级输出
输入一个百分制的成绩t后,按下式输出它的等级。等级为:90~100为A,80~89为B,70~79为C,60~69为D,0~59为E。
样例输入
98
样例输出
A
*/
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
if(t>=90 && t<=100)
printf("A\n");
if(t>=80 && t<=89)
printf("B\n");
if(t>=70 && t<=79)
printf("C\n");
if(t>=60 && t<=69)
printf("D\n");
if(t<60)
printf("E\n");
return 0;
}
/*
算法训练 统计字符次数
输入一个字符串(长度在100以内),统计其中数字字符出现的次数。
样例输入
Ab100cd200
样例输出
6
*/
#include<stdio.h>
int main()
{
char a[101];
int i=0,s=0;
gets(a);
for(i=0;*(a+i)!='\0';i++)
{
if(*(a+i)>=48&&*(a+i)<=57)
s++;
}
printf("%d",s);
return 0;
}
/*
算法训练 连接字符串
编程将两个字符串连接起来。例如country与side相连接成为countryside。
输入两行,每行一个字符串(只包含小写字母,长度不超过100);输出一行一个字符串。
样例输入
country
side
样例输出
countryside
*/
#include<stdio.h>
#include<string.h>
int main()
{
char s1[202],s2[202];
scanf("%s",s1);
scanf("%s",s2);
strcat(s1,s2);
printf("%s",s1);
printf("\n");
return 0;
}
/*
算法训练 筛选号码
问题描述
有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
问最后留下的是原来第几号的那位。
举个例子,8个人围成一圈:
1 2 3 4 5 6 7 8
第1次报数之后,3退出,剩下:
1 2 4 5 6 7 8 (现在从4开始报数)
第2次报数之后,6退出,剩下:
1 2 4 5 7 8 (现在从7开始报数)
第3次报数之后,1退出,剩下:
2 4 5 7 8 (现在从2开始报数)
第4次报数之后,5退出,剩下:
2 4 7 8 (现在从7开始报数)
第5次报数之后,2退出,剩下:
4 7 8 (现在从4开始报数)
第6次报数之后,8退出,剩下:
4 7 (现在从4开始报数)
最后一次报数之后,4退出,剩下:
7.
所以,最后留下来的人编号是7。
输入格式
一个正整数n,(1<n<10000)
输出格式
一个正整数,最后留下来的那个人的编号。
样例输入
8
样例输出
7
数据规模和约定
对于100%的数据,1<n<10000。
*/
#include <stdio.h>
#include <malloc.h>
typedef struct form{
int num;
int date;
struct form *link;}
del;
del *creat(int n){
int i;
del *head,*p1,*p2;
head=(del *)malloc(sizeof(del));
p1=(del *)malloc(sizeof(del));
head->link=p1;
for(i=1;i<=n-2;i++){p2=(del *)malloc(sizeof(del));
p1->link=p2;
p1=p2;}
p1->link=head;
return(head);
}
void dateop(del *h,int n){
del *p;
int i,j=1;
p=h;
for(i=1;i<=n;i++){
p->num=i;
p->date=j;j++;
if(j==4) j=1;
p=p->link;}
}
int deal(del *h,int n){
del *k;
int s;
int count,j=1,i;
count=n;
k=h;
while(count!=1){
if(j==3&&k->date!=0) {k->date=0;count--;}
k=k->link;
j++;
if(k->date==0) j--;
if(j==4) j=1;
}
k=h;
for(i=1;i<=n;i++){
if(k->date!=0) {s=k->num;break;}
k=k->link;}
return(s);}
int main(){
int x;
int i;
del *p;
scanf("%d",&x);
p=creat(x);
dateop(p,x);
x=deal(p,x);
for(i=1;i<x;i++){
p=p->link;}
printf("%d",p->num);
return 0;
}
/*
算法训练 十进制数转八进制数
编写函数把一个十进制数输出其对应的八进制数。
样例输入
9274
样例输出
22072
*/
#include<stdio.h>
int main()
{
int r;
scanf("%d",&r);
printf("%o",r);
return 0;
}
/*
算法训练 斜率计算
输入两个点的坐标,即p1 = (x1, y1)和p2=(x2, y2),求过这两个点的直线的斜率。如果斜率为无穷大输出“INF”。
样例输入
1 2
2 4
样例输出
2
样例输入
1 2
1 4
样例输出
INF
样例输入
1 2
3 2
样例输出
0
*/
#include <stdio.h>
int main(){
int a,b,c,d;
scanf("%d %d",&a,&b);
scanf("%d %d",&c,&d);
if(a==c)
printf("INF\n");
else
printf("%d\n",(b-d)/(a-c));
return 0;
}
/*
算法训练 确定元音字母位置
输入一个字符串,编写程序输出该字符串中元音字母的首次出现位置,如果没有元音字母输出0。英语元音字母只有‘a’、‘e’、‘i’、‘o’、‘u’五个。
样例输入
hello
样例输出
2
样例输入
apple
样例输出
1
样例输入
pmp
样例输出
0
*/
#include <stdio.h>
#include <string.h>
char s[1000]={0};
int isyuanyin(char a)
{
switch(a)
{
case 'a':return 1;
case 'e':return 1;
case 'i':return 1;
case 'o':return 1;
case 'u':return 1;
}
return 0;
}
int main()
{
int l,i,num=0;
scanf("%s",s);
l=strlen(s);
for(i=0;i<l;i++)
if(isyuanyin(s[i]))
{
num=i+1;break;
}
printf("%d",num);
return 0;
}
/*
算法训练 整数平均值
编写函数,求包含n个元素的整数数组中元素的平均值。要求在函数内部使用指针操纵数组元素,其中n个整数从键盘输入,输出为其平均值。 样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数)
5
3 4 0 0 2
样例输出
1
样例输入
7
3 2 7 5 2 9 1
样例输出
4
*/
#include <stdio.h>
int main()
{
int n,i,j,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&j);
sum+=j;
}
printf("%d",sum/n);
return 0;
}
GoToTheNextPart