【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;
}