对任何一个正整数 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; }