1. 程式人生 > >【PAT】basic 1041/1004/1032/1036/1027/1012/1018

【PAT】basic 1041/1004/1032/1036/1027/1012/1018

/*題號:1041. 考試座位號(15)
 *作者:錢金柱
 *日期:2018年4月26日 22:35
 *題目描述:輸入格式:
  輸入第一行給出一個正整數N(<=1000),隨後N行,每行給出一個考生的資訊:“准考證號 試機座位號 考試座位號”。
  其中准考證號由14位數字組成,座位從1到N編號。輸入保證每個人的准考證號都不同,並且任何時候都不會把兩個人分
  配到同一個座位上。考生資訊之後,給出一個正整數M(<=N),隨後一行中給出M個待查詢的試機座位號碼,以空格分隔。
  輸出格式:
  對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用1個空格分隔。

  輸入樣例:
  4
  10120150912233 2 4
  10120150912119 4 1
  10120150912126 1 3
  10120150912002 3 2
  2
  3 4
  輸出樣例:
  10120150912002 2
  10120150912119 1
 */
 
#include <stdio.h>

struct info
{
    char id[15];
    int w_num;
    int t_num;
};

int main(void)
{
    int i, j;    
    int N;
    scanf("%d", &N);    
    
    struct info students[N];
    
    for(i = 0; i < N; i++)
    {
        scanf("%s %d %d", &students[i].id, &students[i].w_num, &students[i].t_num);
    }
    
    int M;
    scanf("%d", &M);
    
    int a[M];
    
    for(j = 0; j < M; j++)
    {
        scanf("%d ", &a[j]);
    }
    
    for(j = 0; j < M; j++)
    {
        for(i = 0; i < N; i++)
        {
            if(a[j] == students[i].w_num)
                
            printf("%s %d\n", students[i].id, students[i].t_num);
            
        }
        
    }
    
    return 0;
}

 

 

#include<stdio.h>
struct Student{
    char name[15];
    char num[15];
    int grade;
}temp,max,min;
int main(){
    int n;
    max.grade=-1;
    min.grade=101;
    scanf("%d",&n);
    while(n--){
        scanf("%s%s%d",temp.name,temp.num,&temp.grade);
        if(temp.grade>max.grade)    max=temp;
        if(temp.grade<min.grade)    min=temp;
    }
    printf("%s %s\n",max.name,max.num);//按座標輸出學生姓名學號 
    printf("%s %s\n",min.name,min.num);
    return 0;

 

/*題號:1032 挖掘機技術哪家強(20)(20 point(s))
 *作者:錢金柱
 *日期:2018年6月29日 19:58
 *題目描述:為了用事實說明挖掘機技術到底哪家強,PAT組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最*強的那個學校。
 *輸入格式:  *輸入在第1行給出不超過10^5^的正整數N,即參賽人數。隨後N行,每行給出一位參賽者的資訊和成績,包括其所代表的**學校的編號(從1開始連續編號)、及其比賽成績(百分制),中間以空格分隔。
 *輸出格式:
 *在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。
 *輸入樣例:
 *6
 *3 65
 *2 80
 *1 100
 *2 70
 *3 40
 *3 0
 *輸出樣例:
 * 2 150
 */
 
#include <stdio.h>


int main(void)
{
    int i, j;
    int max = 0;
    int N;
    scanf("%d", &N);
    
    if(N > 100000)                           
    {
        return -1;
    }            
    
    int school; 
    int score;
    int max_school;
    //定義一個變數記錄學校編號
    int sum[100001] = {0};        //定義一個數組,記錄同一所學校的得分總和    
    
    for(i = 0; i < N; i++)
    {
        scanf("%d %d", &school, &score);   //輸入各位參賽者的資訊
    
        sum[school] += score;  //編號相同的學校的參賽者分數加在一起
        
    
        if(sum[school] > max)                  //篩選出得分最高的學校的編號和成績總和
        {
            max =sum[school];
            max_school = school;
        }    
    }
        
    printf("%d %d\n", max_school, max);              //列印學校編號和成績
    
    return 0;

}

/*題號:1036 跟奧巴馬一起程式設計(15)(15 point(s))
 *作者:錢金柱
 *日期:2018年7月2日 12:31
 *題目描述:美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫程式碼,成為美國曆史上首位編寫計算機程式碼的總統。2014年底,為慶祝“電腦科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機程式碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!

輸入格式:

輸入在一行中給出正方形邊長N(3<=N<=20)和組成正方形邊的某種字元C,間隔一個空格。

輸出格式:

輸出由給定字元C畫出的正方形。但是注意到行間距比列間距大,所以為了讓結果看上去更像正方形,我們輸出的行數實際上是列數的50%(四捨五入取整)。

輸入樣例:

10 a
輸出樣例:

aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa
 */
 
#include <stdio.h>

int main(void)
{
    int i,j;
    int N;
    char ch;
    scanf("%d %c", &N, &ch);    //給出正方形的邊長和組成正方形的字元
    
    int line;                  //定義一個變量表示正方形的行數
    
    if((N % 2) == 0)
        line = N / 2;     //根據給定的邊長,有四捨五入確定行數
    else
        line = (N + 1) / 2;
    

    for(i = 0; i < N; i++)    
        printf("%c", ch);        //列印第一行字元
    printf("\n");                
    
    for(i =0; i < (line - 2); i++)        //列印第2行到第(line-1)字元
    {
        for(j = 0; j < N; j++)
        {
            if(j == 0)
                printf("%c", ch);
            else if(j == (N - 1))
            {
                printf("%c", ch);
                printf("\n");
            }
            else
                printf(" ");            
        }
    }
    for(i = 0; i < N; i++)
        printf("%c", ch);      //列印第一行字元
    printf("\n");
    
    return 0;
    }

 

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

 
 int main(void)
 {    
    int i, j, z;
    int N;
    char c;
    scanf("%d %c", &N,&c);   //輸入要列印符號的數量 ;輸入要列印的符號
    
    double n, s;    //符號從第一行遞減到一個時的行數
    
    s = sqrt((N + 1)/2);
    
    n = floor(s); //一半沙漏的行數
    
    
    int bottom = 0;
    
    bottom = 2 * n - 1; //頂端字元數
    
    if(bottom % 2 == 0)  //判斷最頂端字元數是否為奇數
        bottom = bottom - 1;
        
    int rest = 0;  //剩餘字元數
    
    rest = N - ((1 + bottom) * (1 + bottom))/2 + 1;

    
    for(i = 0; i < n; i++)
    {
        for(z = 0; z < i; z++)
            {
                printf(" ");
            }
        
        for(j = 0; j < (bottom - 2 * i); j++)
        {
            printf("%c", c);
        }
        printf("\n");     
    } 
     
    for(i = 1; i < n; i++)
    {
        for(z = (n - 1 - i); z > 0; z--)
            {
                printf(" ");
            }
        
        for(j = 0; j < (1 + 2 * i); j++)
        {
            printf("%c", c);
        }
        printf("\n");     
        
    } 

    printf("%d\n", rest);
     
    return 0;

}

*題號:1012. 數字分類 (20)
 *作者:錢金柱
 *日期:2018年4月10日 14:12
 *題目描述:給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字:
  A1 = 能被5整除的數字中所有偶數的和;
  A2 = 將被5除後餘1的數字按給出順序進行交錯求和,即計算n1-n2+n3-n4...;
  A3 = 被5除後餘2的數字的個數;
  A4 = 被5除後餘3的數字的平均數,精確到小數點後1位;
  A5 = 被5除後餘4的數字中最大數字。
  輸入格式:

  每個輸入包含1個測試用例。每個測試用例先給出一個不超過1000的正整數N,隨後給出N個不超過1000的待分類的正整數。數字間以空格分隔。

  輸出格式:

  對給定的N個正整數,按題目要求計算A1~A5並在一行中順序輸出。數字間以空格分隔,但行末不得有多餘空格。

  若其中某一類數字不存在,則在相應位置輸出“N”。

  輸入樣例1:
  13 1 2 3 4 5 6 7 8 9 10 20 16 18
  輸出樣例1:
  30 11 2 9.7 9
  輸入樣例2:
  8 1 2 4 5 6 7 9 16
  輸出樣例2:
  N 11 2 N 9
 */

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


//float power(float x,int n);
int main(void)
{
    float f;
    int A1 = 0;
    int A2 = 0;
    int A3 = 0;
    float A4 = 0.0;
    int A5 = 0;
    int m = 0;
    int n = 0;
    int i, d, z; 
    int j = -1;
    int temp1 = 0;
    int temp2 = 0;
    char c = 'N';
    int N;
    scanf("%d", &N);
    
    int a[N];
    int b[1000];
    
    for(i = 0; i < N; i++)
    {    
        scanf("%d", &a[i]);
    }
    
    for(i = 0; i < N; i++)
    {
        if(a[i] % 2 == 0 && a[i] % 5 == 0)
            A1 += a[i];
        else
            continue;
    }
    
    if(A1 != 0)
        printf("%d ", A1);
    else
        printf("%c ", c);
    
    for(i = 0; i < N; i++)
    {
        if(a[i] % 5 == 1)
        {
            m += 1;
            A2 += a[i] * pow(-1,m+1);
            //A2 += a[i] * power(-1,m + 1);
        }
        else
            temp1 += 1;        
    }
    
    if(temp1 != N)
        printf("%d ", A2);
    else
        printf("%c ", c);
    
    for(i = 0; i < N; i++)
    {
        if(a[i] % 5 == 2)
            A3 += 1;    
        else
            continue;    
    }
    
    if(A3 != 0)
        printf("%d ", A3);
    else
        printf("%c ", c);
    
    for(i = 0; i < N; i++)
    {
        if(a[i] % 5 == 3)
        {
            n += 1;
            A4 += a[i];
        }
        else
            temp2 += 1;        
    }
    
    if(temp2 != N)
        printf("%.1f ", A4 / n);
    else
        printf("%c ", c);
    
    for(i = 0; i < N; i++)
    {
        
        if(a[i] % 5 == 4)
        {
            j += 1;
            b[j] = a[i];
        }
        else
            continue;            
    }
    
    for(z = 0; z <= j; z++)
    {
        d =b[z] - A5;
        if(d >= 0)
            A5 = b[z];
        else
            A5 = A5;
    }
        
    if(A5 != 0)
        printf("%d\n", A5);
    else
        printf("%c\n", c);
    
    return 0;
}


/* float power(float x,int n)        //自定義乘方函式
{  int i; 
   float s=1.0;                            //初始化變數s,用於儲存最終結果值

   for( i=1;i<=n;i++ )                     //利用迴圈進行計算,n次方就是把x乘上n遍
       s *= x;

   return s;                               //返回最終結果值
} */

 

/*題號:1018 錘子剪刀布 (20 分)
 *作者:錢金柱
 *日期:2018年10月25日 13:28
 *題目描述:輸入格式:
    輸入第 1 行給出正整數 N(≤105),即雙方交鋒的次數。隨後 N 行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。C 代表“錘子”、J 代表“剪刀”、B代表“布”,第個字母代表甲方,第 2 個代表乙方,中間有 1 個空格。

    輸出格式:
    輸出第 1、2 行分別給出甲、乙的勝、平、負次數,數字間以 1 個空格分隔。第 3行給出兩個字母,分別代表甲、乙獲勝次數最多的手勢,中間有 1 個空格。如果解不唯一,則輸出按字母序最小的解。

    輸入樣例:
    10
    C J
    J B
    C B
    B B
    B C
    C C
    C B
    J B
    B C
    J J
    輸出樣例:
    5 3 2
    2 3 5
    B B
*/

#include <stdio.h>


int main()
{
    int N;
    scanf("%d", &N);
    if (N > 100000)
    {
        return -1;
    }
    int i = 0;
    int jiaWin = 0, jiaLose = 0, draw = 0;
    int jiaJWin = 0, jiaCWin = 0, jiaBWin = 0;
    int yiJWin = 0, yiCWin = 0, yiBWin = 0;
    char jia, yi;
    for(i = 0; i < N; i++)
    {
        scanf(" %c %c", &jia, &yi);
        if(jia == 'C')
        {
            if(yi == 'C')
            {
                draw++;
            }
            else if(yi == 'J')
            {
                jiaWin++;
                jiaCWin++;
            }
            else if(yi == 'B')
            {
                jiaLose++;
                yiBWin++;
            }
        }
        else if(jia == 'J')
        {
            if(yi == 'C')
            {
                jiaLose++;
                yiCWin++;
            }
            else if(yi == 'J')
            {
                draw++;
            }
            else if(yi == 'B')
            {
                jiaWin++;
                jiaJWin++;
            }
        }
        else if(jia == 'B')
        {
            if(yi == 'C')
            {
                jiaWin++;
                jiaBWin++;
            }
            else if(yi == 'J')
            {
                jiaLose++;
                yiJWin++;
            }
            else if(yi == 'B')
            {
                draw++;
            }
        }
    }
    printf("%d %d %d\n", jiaWin, draw, jiaLose);
    //yiwin就是jialose
    printf("%d %d %d\n", jiaLose, draw, jiaWin);
    //利用三目運算子比較三種手勢勝負平
    printf("%c ", jiaBWin >= jiaCWin ? (jiaBWin >= jiaJWin ? 'B' : 'J') : (jiaCWin >= jiaJWin ? 'C' : 'J'));
    printf("%c\n", yiBWin >= yiCWin ? (yiBWin >= yiJWin ? 'B' : 'J') : (yiCWin >= yiJWin ? 'C' : 'J'));
    return 0;
}