標籤:

PAT團體程序設計天梯賽-練習集答案

這個是本萌新準備找工作時自己在網上刷的題目和自己寫的答案,類似的答案在網上很多,我也的答案也算不上好,僅僅是留下來做個備份(所有答案由C++或Python編寫)編寫環境為Win7 64bit, VS2017。

網址鏈接:團體程序設計天梯賽-練習集 | Programming Ability Test

話不多說,下面是題目。

2、列印沙漏

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

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

19 *

輸出樣例:

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

我的解法:

#include<iostream>#include<cmath>using namespace std;int main(){ int a, left;//a為輸入*的個數,left為最後剩餘*的個數,n為上半部分的行數 int n; char sign;//sign為用戶輸入的符號 //cout << "輸入數字和符號" << endl; cin >> a; cin >> sign; n = (int)sqrt((a + 1) / 2); left = (int)a - (2 * n*n - 1); //cout <<"行數n:"<< n << endl; for (int i= n; i > 1; i--) { for (int j = 2*i-1; j > 0; j--) { cout << sign; } cout << "
"; for (int k = n-i+1;k>0 ;k-- ) { cout << " "; } } for (int i = 1; i <= n; i++) { for (int j = 2 * i - 1; j > 0; j--) { cout <<sign; } cout << "
"; for (int k = n - i + 1; k>2; k--) { cout << " "; } } cout <<left << endl; return 0;}

3、個位數統計

給定一個k位整數 N = x_{k-1}*10^{k-1}+....+ x_{1}*10^{1}+x_0,請編寫程序統計每種不同的個位數字出現的次數。例如:給定N = 100311,則有2個0,3個1,和1個3。

輸入格式:

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

輸出格式:

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

輸入樣例:100311

輸出樣例:

0:2

1:3

3:1

#include<iostream>#include<string>using namespace std;int main(){ string s; int n[10] = { 0 }; cin >> s; for (int i = 0; i < s.length(); i++) { switch (s[i]) { default:cout << "輸入有誤" << endl; break; case 0:n[0]++; break; case 1:n[1]++; break; case 2:n[2]++; break; case 3:n[3]++; break; case 4:n[4]++; break; case 5:n[5]++; break; case 6:n[6]++; break; case 7:n[7]++; break; case 8:n[8]++; break; case 9:n[9]++; break; } } for (int j = 0; j < 10; j++) { if (n[j] != 0) { cout << j << ":" << n[j] << endl; } } return 0;}

7、念數字

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出「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

我的解法:

#include<iostream>#include<string>using namespace std;int main(){ string s;//s為輸入的字元串 cin >> s;//有朋友問我這個地方有沒有報錯,別的編譯器我不太了解,至少在VS2017 //沒有報錯,然後也通過了PAT的檢測 if (s[0]==-) { cout << "fu "; for (int i = 1; i < s.length()-1; i++) { switch (s[i]) { case 0:cout << "ling "; break; case 1:cout << "yi "; break; case 2:cout << "er "; break; case 3:cout << "san "; break; case 4:cout << "si "; break; case 5:cout << "wu "; break; case 6:cout << "liu "; break; case 7:cout << "qi "; break; case 8:cout << "ba "; break; case 9:cout << "jiu "; break; default:cout << "wrong" << endl; } } switch (s[s.length()-1]) { case 0:cout << "ling"; break; case 1:cout << "yi"; break; case 2:cout << "er"; break; case 3:cout << "san"; break; case 4:cout << "si"; break; case 5:cout << "wu"; break; case 6:cout << "liu"; break; case 7:cout << "qi"; break; case 8:cout << "ba"; break; case 9:cout << "jiu"; break; default:cout << "wrong" << endl; } //又重複寫了一遍是因為,第一次輸出的拼音後面有一個空格,導致無法通過PAT的 //檢測,這樣寫確實很繁瑣,我再考慮考慮有沒有簡化的方法,下面的兩個switch //也是這個原因。 } else { for (int i = 0; i < s.length()-1; i++) { switch (s[i]) { case 0:cout << "ling "; break; case 1:cout << "yi "; break; case 2:cout << "er "; break; case 3:cout << "san "; break; case 4:cout << "si "; break; case 5:cout << "wu "; break; case 6:cout << "liu "; break; case 7:cout << "qi "; break; case 8:cout << "ba "; break; case 9:cout << "jiu "; break; default:cout << "wrong" << endl; } } switch (s[s.length() - 1]) { case 0:cout << "ling"; break; case 1:cout << "yi"; break; case 2:cout << "er"; break; case 3:cout << "san"; break; case 4:cout << "si"; break; case 5:cout << "wu"; break; case 6:cout << "liu"; break; case 7:cout << "qi"; break; case 8:cout << "ba"; break; case 9:cout << "jiu"; break; default:cout << "wrong" << endl; } } return 0;}

推薦閱讀:

求余和取模
理論上最好的編程語言: 起點動機篇
php 與C/C++ 集成的方法有哪些?
如何編寫優質的API文檔?

TAG:編程語言 |