對任何一個正整數 n,若是它是偶數,那麼把它砍掉一半;若是它是奇數,那麼把 ( 砍掉一半。這樣一直反覆砍下去,最後必定在某一步獲得 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜測,傳說當時耶魯大學師生齊動員,拼命想證實這個貌似很傻很天真的命題,結果鬧得學生們無意學業,一心只證 (,以致於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……html
咱們今天的題目不是證實卡拉茲猜測,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,須要多少步(砍幾下)才能獲得 n=1?ios
每一個測試輸入包含 1 個測試用例,即給出正整數 n 的值。c++
輸出從 n 計算到 1 須要的步數。編程
3
AC代碼以下:5
#include <iostream> using namespace std; int main(){ int N; cin>>N; int res = 0; while(N!=1){ res++; if(N%2==0){ N/=2; } else{ N=3*N+1; N/=2; } } cout<<res; return 0; }
讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。測試
每一個測試輸入包含 1 個測試用例,即給出天然數 n 的值。這裏保證 n 小於 1。flex
在一行內輸出 n 的各位數字之和的每一位,拼音數字間有 1 空格,但一行中最後一個拼音數字後沒有空格。spa
1234567890987654321123456789
AC代碼:yi san wu
#include <iostream> #include <string> #include <map> using namespace std; typedef long long ll; int main(){ string nums; cin>>nums; ll res = 0; for(int i=0;i<nums.length();i++){ res+=nums[i]-'0'; } map<int,string> m; m[0]="ling"; m[1]="yi"; m[2]="er"; m[3]="san"; m[4]="si"; m[5]="wu"; m[6]="liu"; m[7]="qi"; m[8]="ba"; m[9]="jiu"; string b = to_string(res); for(int i=0;i<b.length();i++){ cout<<m[b[i]-'0']; if(i!=b.length()-1) cout<<" "; } return 0; }
「答案正確」是自動判題系統給出的最使人歡喜的回覆。本題屬於 PAT 的「答案正確」大派送 —— 只要讀入的字符串知足下列條件,系統就輸出「答案正確」,不然輸出「答案錯誤」。code
獲得「答案正確」的條件是:htm
P
、 A
、 T
這三種字符,不能夠包含其它字符;xPATx
的字符串均可以得到「答案正確」,其中 x
或者是空字符串,或者是僅由字母 A
組成的字符串;aPbTc
是正確的,那麼 aPbATca
也是正確的,其中 a
、 b
、 c
均或者是空字符串,或者是僅由字母 A
組成的字符串。如今就請你爲 PAT 寫一個自動裁判程序,斷定哪些字符串是能夠得到「答案正確」的。blog
每一個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<),是須要檢測的字符串個數。接下來每一個字符串佔一行,字符串長度不超過 100,且不包含空格。
每一個字符串的檢測結果佔一行,若是該字符串能夠得到「答案正確」,則輸出 YES
,不然輸出 NO
。
8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA
YES YES YES YES NO NO NO NO
AC代碼
// // Created by GodofOrange on 2019/6/13. // #include <iostream> #include <string> using namespace std; int main(){ int N; cin>>N; while(N--){ string str =""; cin>>str; int sign=0,P=0,T=0,a=0,b=0,c=0; for(int i=0;i<str.length();i++){ if(str[i]!='P'&&str[i]!='A'&&str[i]!='T'){sign++;break;} if(str[i]=='A'&&P==0&&T==0){a++;continue;} if(str[i]=='P'){if(P!=0||T!=0){sign++;break;}else P++;continue;} if(str[i]=='A'&&P==1&&T==0){b++;continue;} if(str[i]=='T'){if(P==0||T!=0){sign++;break;}else T++;continue;} if(str[i]=='A'&&P==1&&T==1){c++;continue;} } if(P==0||b+c+a==0||T==0) sign++; if(sign>0) cout<<"NO"<<endl; else{ if(a==c&&b==1) cout<<"YES"<<endl; else if(c==0||a==0) cout<<"YES"<<endl; else if(c%a==0&&b==c/a) { cout << "YES"<<endl; }else{ cout<<"NO"<<endl; } } } return 0; }
讀入 n(>)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。
每一個測試輸入包含 1 個測試用例,格式爲
第 1 行:正整數 n 第 2 行:第 1 個學生的姓名 學號 成績 第 3 行:第 2 個學生的姓名 學號 成績 ... ... ... 第 n+1 行:第 n 個學生的姓名 學號 成績
其中姓名
和學號
均爲不超過 10 個字符的字符串,成績爲 0 到 100 之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。
對每一個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字符串間有 1 空格。
3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95
AC代碼:Mike CS991301 Joe Math990112
#include <iostream> #include <string> using namespace std; int main(){ int N; cin>>N; int max=0,min=100; string res1; string res2; string res3; string res4; while(N--){ string str1 = ""; string str2 =""; cin>>str1>>str2; int A = 0; cin>>A; if(A>=max){ max=A; res1=str1; res2=str2; } if(A<=min){ min=A; res3=str1; res4=str2; } } cout<<res1<<" "<<res2<<endl; cout<<res3<<" "<<res4<<endl; return 0; }
卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。
當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對 n=3 進行驗證的時候,咱們須要計算 三、五、八、四、二、1,則當咱們對 n=五、八、四、2 進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這 4 個數已經在驗證3的時候遇到過了,咱們稱 五、八、四、2 是被 3「覆蓋」的數。咱們稱一個數列中的某個數 n 爲「關鍵數」,若是 n 不能被數列中的其餘數字所覆蓋。
如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。
每一個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<),第 2 行給出 K 個互不相同的待驗證的正整數 n (1)的值,數字間用空格隔開。
每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。
6 3 5 6 7 8 11
7 6
#include <iostream> #include <set> #include <algorithm> using namespace std; int N = 0; int main(){ cin>>N; int *A = new int[N]; for(int i=0;i<N;i++){ cin>>A[i]; } sort(A,A+N); set<int> s2; for (int i=N-1;i>=0;i--) { int r =A[i]; while(r!=1){ if(r%2==0){ r/=2; s2.insert(r); } else{ r=r*3+1; r/=2; s2.insert(r); } } } int *C = new int[10000]; int sign=0; for(int i=N-1,j=0;i>=0;i--){ if(s2.count(A[i])==0){ C[j]=A[i]; j++; sign++; } } for(int i=0;i<sign;i++){ cout<<C[i]; if(i!=sign-1) cout<<" "; } return 0; }