1. 程式人生 > >PTA|團體程式設計天梯賽-練習題目題解錦集(C/C++)(持續更新中……)

PTA|團體程式設計天梯賽-練習題目題解錦集(C/C++)(持續更新中……)

PTA|團體程式設計天梯賽-練習題目題解錦集(持續更新中)

實現語言:C/C++;      歡迎各位看官交流討論、指導題解錯誤;或者分享更快的方法!!

題目連結:https://pintia.cn/problem-sets/994805046380707840/problems


目錄

(點選對應題目即可進入相應題解……小聲BB……)

L1-001 Hello World (5 分)

L1-002 列印沙漏 (20 分)

L1-003 個位數統計 (15 分)

L1-004 計算攝氏溫度 (5 分)

L1-005 考試座位號 (15 分)

L1-006 連續因子 (20 分)

L1-007 念數字 (10 分)

L1-008 求整數段和 (10 分)

L1-009 N個數求和 (20 分)

L1-010 比較大小 (10 分)

L1-011 A-B (20 分)

L1-012 計算指數 (5 分)

L1-013 計算階乘和 (10 分)

L1-014 簡單題 (5 分)

L1-015 跟奧巴馬一起畫方塊 (15 分)

L1-016 查驗身份證 (15 分)

L1-017 到底有多二 (15 分)

L1-018 大笨鐘 (10 分)

L1-019 誰先倒 (15 分)

L1-020 帥到沒朋友 (20 分)

                

持續更新中……


L1-001 Hello World (5 分)

這道超級簡單的題目沒有任何輸入。

你只需要在一行中輸出著名短句“Hello World!”就可以了。

輸入樣例:

輸出樣例:

Hello World!

題目程式碼:

#include<stdio.h>

int main() { printf("Hello World!\n"); return 0; }

L1-002 列印沙漏 (20 分)

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2

 題目程式碼:

#include <stdio.h>
int main() { int n; char c; scanf("%d %c",&n,&c); int sum=1;//沙漏需要的字元個數 int i=1;//層數 while(sum<=n) { sum+=2*(2*(i+1)-1);//2n-1是一層的個數,乘以2代表兩層一共需要的 if(sum<=n) i++; } int j,k; for(j=0;j<i;j++)//列印上半部分 { for(k=0;k<j;k++) printf(" "); for(k=0;k<2*(i-j)-1;k++) { printf("%c",c); }//輸出* printf("\n"); } for(j=2;j<=i;j++) { for(k=0;k<i-j;k++) printf(" "); for(k=0;k<2*j-1;k++) { printf("%c",c); } printf("\n"); } printf("%d",n-(sum-2*(2*(i+1)-1))); }

L1-003 個位數統計 (15 分)

給定一個 k 位整數 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​>0),請編寫程式統計每種不同的個位數字出現的次數。例如:給定 N=100311,則有 2 個 0,3 個 1,和 1 個 3。

輸入格式:

每個輸入包含 1 個測試用例,即一個不超過 1000 位的正整數 N。

輸出格式:

對 N 中每一種不同的個位數字,以 D:M 的格式在一行中輸出該位數字 D 及其在 N 中出現的次數 M。要求按 D 的升序輸出。

輸入樣例:

100311

輸出樣例:

0:2
1:3
3:1

題目程式碼:

#include<iostream>
#include<cstring> #define MAXN 1001 using namespace std; int main() { char s[MAXN]; int book[10]={0}; scanf("%s",s); for(int i=0;i<strlen(s);i++) book[s[i]-48]++; for(int i=0;i<10;i++) { if(book[i]!=0) cout << i << ":" << book[i] << endl; } return 0; }

L1-004 計算攝氏溫度 (5 分)

給定一個華氏溫度F,本題要求編寫程式,計算對應的攝氏溫度C。計算公式:C=5×(F−32)/9。題目保證輸入與輸出均在整型範圍內。

輸入格式:

輸入在一行中給出一個華氏溫度。

輸出格式:

在一行中按照格式“Celsius = C”輸出對應的攝氏溫度C的整數值。

輸入樣例:

150

輸出樣例:

Celsius = 65

題目程式碼:

#include<iostream>

using namespace std; int main() { int n,c; scanf("%d",&n); c=5*(n-32)/9; printf("Celsius = %d\n",c); return 0; } 

L1-005 考試座位號 (15 分)

每個 PAT 考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常情況下,考生在入場時先得到試機座位號碼,入座進入試機狀態後,系統會顯示該考生的考試座位號碼,考試時考生需要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿著領到的試機座位號碼求助於你,從後臺查出他們的考試座位號碼。

輸入格式:

輸入第一行給出一個正整數 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

題目程式碼:

//L1-005 考試座位號
#include<iostream>
#define MAXN 1001 using namespace std; struct STU{ char s[15]; int shiji; int kaoshi; }; int main() { struct STU stu[MAXN]={0}; int N,M; // int a[MAXN][MAXN]={0}; cin >> N; for(int i=0;i<N;i++) scanf("%s %d %d",stu[i].s,&stu[i].shiji,&stu[i].kaoshi); int k; scanf("%d",&M); for(int i=0;i<M;i++) { scanf("%d",&k); for(int j=0;j<N;j++) if(k==stu[j].shiji) { cout << stu[j].s << " " << stu[j].kaoshi << endl; break; } } return 0; }

L1-006 連續因子 (20 分)

一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 3 個連續的數字。給定任一正整數 N,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。

輸入格式:

輸入在一行中給出一個正整數 N(1<N<2​31​​)。

輸出格式:

首先在第 1 行輸出最長連續因子的個數;然後在第 2 行中按 因子1*因子2*……*因子k 的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1 不算在內。

輸入樣例:

630

輸出樣例:

3
5*6*7

題目程式碼 :

#include<iostream>
#include<cmath> using namespace std; typedef long long ll; int main() { ll n; cin>>n; ll prd=0;//定義乘積 int start=0,len=0;//定義最終得到序列開始的因子,序列的長度 for(int i=2;i<=sqrt(n);i++)//i從2到根號n { prd=1; for(int j=i;prd*j<=n;j++)//從j開始一直乘到N為止,每次乘積判定是否小於等於N,若超過N,則結束迴圈 { prd*=j;//乘積迭代 if(n%prd==0&&j-i+1>len)//如果當前乘積為N的乘積因子且長度大於上一次 {//更新序列起始因子和長度 start=i; len=j-i+1; } } } if(start==0)//若起始因子為0,說明N為質數,因為質數=1*本身,而迴圈最多能表示1*本身的根號 { start=n; len=1; } cout<<len<<'\n'<<start; for(int i=start+1;i<start+len;i++)//輸出,如果因子只有一個只輸出一個 cout<<'*'<<i; return 0; }

L1-007 念數字 (10 分)

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出fu字。十個數字對應的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

輸入格式:

輸入在一行中給出一個整數,如:1234

提示:整數包括負數、零和正數。

輸出格式:

在一行中輸出這個整數對應的拼音,每個數字的拼音之間用空格分開,行末沒有最後的空格。如 yi er san si

輸入樣例:

-600

輸出樣例:

fu liu ling ling

題目程式碼:

//L1-007 念數字
#include<iostream>
#include<cmath> #include<cstring> using namespace std; int main(){ char ch[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; char s[1001]; cin >> s; int k=strlen(s); if(s[0]=='-') { cout << "fu "; for(int i=1;i<k;i++) { if(i!=k-1) cout << ch[s[i]-48] << " "; } } else { for(int i=0;i<k;i++) if(i!=k-1) cout << ch[s[i]-48] << " "; } cout << ch[s[k-1]-48]; // cout << endl; return 0; }

L1-008 求整數段和 (10 分)

給定兩個整數A和B,輸出從A到B的所有整數以及這些數的和。

輸入格式:

輸入在一行中給出2個整數A和B,其中−100≤A≤B≤100,其間以空格分隔。

輸出格式:

首先順序輸出從A到B的所有整數,每5個數字佔一行,每個數字佔5個字元寬度,向右對齊。最後在一行中按Sum = X的格式輸出全部數字的和X

輸入樣例:

-3 8

輸出樣例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

題目程式碼 :

//L1-008 求整數段和 
#include<iostream>

using namespace std; int main() { int a,b,sum=0,count=0; scanf("%d%d",&a,&b); for(int i=a;i<=b;i++) { printf("%5d",i); sum+=i; count++; if(count%5==0) printf("\n"); } if((b-a+1)%5==0) printf("Sum = %d\n",sum); else printf("\nSum = %d\n",sum); return 0; } 

L1-009 N個數求和 (20 分)

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。

輸入格式:

輸入第一行給出一個正整數N(≤100)。隨後一行按格式a1/b1 a2/b2 ...給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面