演算法-藍橋杯習題(3-4)
阿新 • • 發佈:2019-01-11
藍橋杯習題
藍橋杯練習系統習題加答案,總共分為6部分,90%習題使用C語言解答,部分使用C++或者Java。大部分習題為搜尋參考或者別人提供所得,不足之處在所難免,懇請批評指正(預計200多題,習題僅供學習交流)目錄
藍橋杯練習系統評測資料
演算法訓練(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