1. 程式人生 > >演算法-藍橋杯習題(3-4)

演算法-藍橋杯習題(3-4)

藍橋杯習題

藍橋杯練習系統習題加答案,總共分為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