1. 程式人生 > >藍橋杯練習系統試題集(二)--基礎練習(含C/C++答案)

藍橋杯練習系統試題集(二)--基礎練習(含C/C++答案)

藍橋杯練習系統試題集(二)–基礎練習(含C/C++答案)

試題集目錄

1 基礎練習 閏年判斷

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述 給定一個年份,判斷這一年是不是閏年。

當以下情況之一滿足時,這一年是閏年:

  1. 年份是4的倍數而不是100的倍數;

  2. 年份是400的倍數。

其他的年份都不是閏年。

輸入格式 輸入包含一個整數y,表示當前的年份。 輸出格式 輸出一行,如果給定的年份是閏年,則輸出yes,否則輸出no。
說明:當試題指定你輸出一個字串作為結果(比如本題的yes或者no,你需要嚴格按照試題中給定的大小寫,寫錯大小寫將不得分。

樣例輸入 2013 樣例輸出 no 樣例輸入 2016 樣例輸出 yes 資料規模與約定 1990 <= y <= 2050。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list> #include<map> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);(i++)) #define inf 0x3f3f3f #define ll long long #define pi acos(-1) int main() { int n; cin>>n; if(n%400==0||(n%4==0&&(n%100)!=0)) printf("yes\n"); else printf
("no\n"); return 0; }

2 基礎練習 01字串

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述
對於長度為5位的一個01串,每一位都可能是0或1,一共有32種可能。它們的前幾個是:

00000

00001

00010

00011

00100

請按從小到大的順序輸出這32種01串。

輸入格式 本試題沒有輸入。 輸出格式 輸出32行,按從小到大的順序每行一個長度為5的01串。 樣例輸出 00000 00001 00010
00011 <以下部分省略>

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
string valueTrans(int n)
{
    string tmp="";
    string ans="";
    while(n){
        int r=n%2;
        tmp+= r+'0';
        n /= 2;
    }
    for(int i=tmp.length()-1;i>=0;i--)
        ans+=tmp[i];
    return ans;
}

int main(){ 

    rep(i,0,31)
    {
        string s=valueTrans(i);
        rep(i,1,5-s.length())
            printf("0");
        cout<<s<<endl;
    }
    return 0;
}

3 基礎練習 字母圖形

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述
利用字母可以組成一些美麗的圖形,下面給出了一個例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

這是一個5行7列的圖形,請找出這個圖形的規律,並輸出一個n行m列的圖形。

輸入格式 輸入一行,包含兩個整數n和m,分別表示你要輸出的圖形的行數的列數。 輸出格式 輸出n行,每個m個字元,為你的圖形。 樣例輸入 5
7 樣例輸出 ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 資料規模與約定 1 <= n, m <=
26。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
#define pi acos(-1)
int main()
{
    int n,m;
    cin>>n>>m;
    string s;
    rep(i,1,m)
        s+='A'+i-1;
    cout<<s<<endl;
    rep(i,2,n){
        string sub=s.substr(0,s.length()-1);
        char ch=s[0]+1;
        s=ch+sub;
        cout<<s<<endl;
    }

    return 0;
}

4 基礎練習 數列特徵

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述 給出n個數,找出這n個數的最大值,最小值,和。

輸入格式 第一行為整數n,表示數的個數。

第二行有n個數,為給定的n個數,每個數的絕對值都小於10000。

輸出格式 輸出三行,每行一個整數。第一行表示這些數中的最大值,第二行表示這些數中的最小值,第三行表示這些數的和。 樣例輸入 5 1 3 -2
4 5 樣例輸出 5
-2 11 資料規模與約定 1 <= n <= 10000。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
#define pi acos(-1)
int a[10005];
int main()
{
    int n,mx=-inf,mi=inf;
    ll sum=0;
    cin>>n;
    rep(i,1,n){
        cin>>a[i];
        sum+=a[i];
        if(mx<a[i])
            mx=a[i];
        if(mi>a[i])
            mi=a[i];
    }
    printf("%d\n",mx);
    printf("%d\n",mi);
    printf("%lld\n",sum);
    return 0;
}

5 基礎練習 查詢整數

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述
給出一個包含n個整數的數列,問整數a在數列中的第一次出現是第幾個。

輸入格式 第一行包含一個整數n。

第二行包含n個非負整數,為給定的數列,數列中的每個數都不大於10000。

第三行包含一個整數a,為待查詢的數。

輸出格式 如果a在數列中出現了,輸出它第一次出現的位置(位置從1開始編號),否則輸出-1。 樣例輸入 6 1 9 4 8 3 9 9
樣例輸出 2 資料規模與約定 1 <= n <= 1000。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
#define pi acos(-1)
int main()
{
    int n,a[1005];
    cin>>n;
    rep(i,1,n)
        cin>>a[i];
    int v,index=-1;
    cin>>v;
    rep(i,1,n)
        if(a[i]==v){
            index=i;
            break;
        }
    printf("%d\n",index);

    return 0;
}

6 基礎練習 楊輝三角形

時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述
楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。

   它的一個重要性質是:三角形中的每個數字等於它兩肩上的數字相加。

   下面給出了楊輝三角形的前4行:

   1

   1 1

   1 2 1

   1 3 3 1

   給出n,輸出它的前n行。

輸入格式 輸入包含一個數n。

輸出格式 輸出楊輝三角形的前n行。每一行從這一行的第一個數開始依次輸出,中間使用一個空格分隔。請不要在前面輸出多餘的空格。 樣例輸入 4
樣例輸出 1 1 1 1 2 1 1 3 3 1 資料規模與約定 1 <= n <= 34。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
#define pi acos(-1)
bool pd(int n){
    int x=n/100;
    int y=(n/10)%10;
    int z=n%10;
    if(n==x*x*x+y*y*y+z*z*z)
        return true;
    else
        return false;
}
int main()
{
    rep(i,100,999)
        if(pd(i))
        printf("%d\n",i);
    return 0;
}

7 基礎練習 特殊的數字

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  153是一個非常特殊的數,它等於它的每位數字的立方和,即153=1*1*1+5*5*5+3*3*3。程式設計求所有滿足這種條件的三位十進位制數。
輸出格式   按從小到大的順序輸出滿足條件的三位十進位制數,每個數佔一行。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<list>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define inf 0x3f3f3f
#define ll long long
#define pi acos(-1)
bool pd(int n){
    int x=n/100;
    int y=(n/10)%10;
    int z=n%10;
    if(n==x*x*x+y*y*y+z*z*z)
        return true;
    else
        return false;
}
int main()
{
    rep(i,100,999)
        if(pd(i))
        printf("%d\n",i);
    return 0;
}

8 基礎練習 迴文數

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進位制數。 輸出格式
  按從小到大的順序輸出滿足條件的四位十進位制數。

#include<stdio.h>
int main()
{
    int i,j;
    int a,b;
    for(i=1;i<=9;i++)
        for(j=0;j<=9;j++)
            printf("%d\n",i*1000+j*100+j*10+i);
    return 0;
}

9 基礎練習 特殊迴文數

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。   輸入一個正整數n,
程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 。 輸入格式   輸入一行,包含一個正整數n。 輸出格式
  按從小到大的順序輸出滿足條件的整數,每個整數佔一行。 樣例輸入 52 樣例輸出 899998 989989 998899 資料規模和約定
  1<=n<=54。

#include <iostream>  
using namespace std;  

int main()  
{  
    int n;  
    cin>>n;  
    for(int i=10000;i<=999999;++i)//全部範圍  
    {  
        if(i<=99999)//五位數  
        {  
            int temp=i;  
            int a,b,c,d,e;  
            a=temp%10;  
            b=temp/10%10;  
            d=temp/1000%10;  
            c=temp/100%10;  
            e=temp/10000;  
            if(a==e&&b==d&&a+b+c+d+e==n)  
                cout<<i<<endl;  
        }  
        else//六位數  
        {  
            int temp=i;  
            int a,b,c,d,e,f;  
            a=temp%10;  
            b=temp/10%10;  
            c=temp/100%10;  
            d=temp/1000%10;  
            e=temp/10000%10;  
            f=temp/100000;  
            if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n)  
                cout<<i<<endl;  
        }  
    }  
    return 0;  
}

10 基礎練習 十進位制轉十六進位制

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  十六進位制數是在程式設計時經常要使用到的一種整數的表示方式。它有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。
  給出一個非負整數,將它表示成十六進位制的形式。 輸入格式   輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式   輸出這個整數的16進製表示 樣例輸入 30 樣例輸出 1E

#include<stdio.h>  
int main()  
{  
    int n;  
    scanf("%d",&n);  
    printf("%X\n",n);  
    return 0;  
}  

11 基礎練習 十六進位制轉十進位制

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。
  注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入 FFFF 樣例輸出 65535

#include <stdio.h>  
#include <string.h>  
#include <math.h>  

int main()  
{  
    char strHex[8];  
    int i = 0, len = 0, temp = 0;  
    __int64 nDec = 0;  

    gets(strHex);  

    len = strlen(strHex);  
    for (i = 0; strHex[i] != '\0'; ++i)  
    {  
        switch(strHex[i])  
        {  
        case 'A': temp = 10; break;  
        case 'B': temp = 11; break;  
        case 'C': temp = 12; break;  
        case 'D': temp = 13; break;  
        case 'E': temp = 14; break;  
        case 'F': temp = 15; break;  
        default: temp = strHex[i]-'0'; break;  
        }  
        nDec += (temp*pow(16,len-1-i));  
    }  
    printf("%I64d",nDec);  

    return 0;  
}  

12 基礎練習 十六進位制轉八進位制

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  給定n個十六進位制正整數,輸出它們對應的八進位制數。

輸入格式   輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。

輸出格式   輸出n行,每行為輸入對應的八進位制正整數。

  【注意】   輸入的十六進位制數不會有前導0,比如012A。   輸出的八進位制數也不能有前導0。

樣例輸入   2   39   123ABC

樣例輸出   71   4435274

  【提示】   先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。

#include <iostream>
using namespace std;
int main()
{
int n=0; //記錄輸入資料的個數
cin>>n;

string sixTeen[10];  //用來記錄輸入的資料

for(int i=0;i<n;i++)
{
cin>>sixTeen[i];
}


for(int i=0;i<n;i++)
{
string eight;//記錄八進位制資料
string tow; //記錄二進位制資料
char eig;

//轉換為二進位制
for(int j=0;j<sixTeen[i].length();j++)
{
switch(sixTeen[i][j])
{
case '0':tow+="0000";break;
                case '1':tow+="0001";break;
                case '2':tow+="0010";break;
                case '3':tow+="0011";break;
                case '4':tow+="0100";break;
                case '5':tow+="0101";break;
                case '6':tow+="0110";break;
                case '7':tow+="0111";break;
                case '8':tow+="1000";break;
                case '9':tow+="1001";break;
                case 'A':tow+="1010";break;
                case 'B':tow+="1011";break;
                case 'C':tow+="1100";break;
                case 'D':tow+="1101";break;
                case 'E':tow+="1110";break;
                case 'F':tow+="1111";break;
                default:break;
}

}

//轉換為八進位制
//首先補齊“0”
int m=tow.length()%3;
if(m==1)
tow.insert(0,"00");
else if(m==2)
tow.insert(0,"0");
//進行轉換
if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0'))
{
eig=(tow[0]-'0')*4+(tow[1]-'0')*2+(tow[2]);
eight=eight+eig;
}

for(int k=3;k<tow.length();k=k+3)
{
//eig=(tow[k*3]-'0')*4+(tow[k*3+1]-'0')*2+(tow[k*3+2]);
//eight=eight+eig;

if(tow.substr(k,3)=="000")
eight+="0";
else if(tow.substr(k,3)=="001")
eight+="1";
else if(tow.substr(k,3)=="010")
eight+="2";
else if(tow.substr(k,3)=="011")
eight+="3";
else if(tow.substr(k,3)=="100")
eight+="4";
else if(tow.substr(k,3)=="101")
eight+="5";
else if(tow.substr(k,3)=="110")
eight+="6";
else if(tow.substr(k,3)=="111")
eight+="7";

}

//輸出最終的八進位制數
cout<<eight<<endl;
}

return 0;
}

13 基礎練習 數列排序

時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述
  給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200 輸入格式   第一行為一個整數n。
  第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。 輸出格式   輸出一行,按從小到大的順序輸出排序後的數列。 樣例輸入
5 8 3 6 4 9 樣例輸出 3 4 6 8 9

#include<iostream>  
#include<algorithm> 
#define MAX 200+5 
using namespace std;  
int main()  
{  
    int n;
    int i=0;
    int a[MAX]; 
    scanf("%d\n",&n);
    while(i<n)
    {
        cin >> a[i++] ;
        if ( cin.get() == '\n' ) //遇到回車,結束輸入
        {
            break;
        }
    }
    sort(a,a+n);  
    for(int i=0; i<n; i++)  
        printf("%d ",a[i]);  
    printf("\n");  
}