?
?
注:这里涵盖了PAT BASIC的全部30道题,难度较易,但还是为初学者做一个参考,最好自己想出思路,找出错误数据,代码仅供参考。
?
1001 注意统计砍一半的次数
?
#include1002 不解释#include using namespace std; int n; void solve() { int cnt = 0; while(n != 1) { if(n & 1) n = (3*n+1)>>1; else n >>= 1; cnt++; } printf(%d , cnt); } int main() { while(~scanf(%d, &n)) { solve(); } }
?
?
#include1003 我要通过#include #include using namespace std; char s[1010]; string dig[] = {ling, yi, er, san, si, wu, liu, qi, ba, jiu}; void solve() { int i = 0, sum = 0; while(s[i] != '') { sum += s[i]-'0'; i++; } stack stk; while(sum) { stk.push(sum%10); sum /= 10; } while(stk.size() > 1) { cout << dig[stk.top()] << ; stk.pop(); } cout << dig[stk.top()] << endl; stk.pop(); } int main() { while(~scanf(%s, s)) solve(); return 0; }
?
有几点注意:
1:不能有除P、A、T外其他字符,且P和T只能出现一次,且P在T左边
2:说白了就是判断(P左边A的个数)*(P与T之间A的个数)是否等于(T右边A的个数)。
?
#include1004 不解释#include #include using namespace std; int main() { int t; char s[110]; scanf(%d, &t); while(t--) { scanf(%s, s); bool flag = true; int n = strlen(s); int pp = -1, pt = -1; for(int i = 0; i < n; i++) { if(s[i] != 'P' && s[i] != 'A' && s[i] != 'T') { flag = false; break;} if(s[i] == 'P') { if(pp == -1) pp = i; else {flag = false; break; } } if(s[i] == 'T') { if(pt == -1) pt = i; else {flag = false; break; } } } if(!flag || pt - pp < 2) { printf(NO ); continue; } if((pp*(pt-pp-1) == n-pt-1)) printf(YES ); else printf(NO ); } return 0; }
?
?
#include1005 继续3n+1猜想#include #include using namespace std; int main() { int n, grade[1010]; string name[1010], id[1010]; while(cin >> n) { int maxg = 0, ming = 101, id1 = 0, id2 = 0; for(int i = 0; i < n; i++) { cin >> name[i] >> id[i] >> grade[i]; if(maxg < grade[i]) { id1 = i; maxg = grade[i]; } if(ming > grade[i]) { id2 = i; ming = grade[i]; } } cout << name[id1] << << id[id1] << endl; cout << name[id2] << << id[id2] << endl; } return 0; }
?
数字有3中状态:0未使用,1使用但为被覆盖,2使用且被覆盖。那么重要的就是标记过程了,具体见代码。
?
#include1006 不解释#include #include #include using namespace std; int n, a[110], vis[110], key[110]; bool cmp(int a, int b) { return a > b; } void solve() { for(int i = 0; i < n; i++) { long long m = a[i]; if(vis[m] == 2) continue; while(m != 1) { if(m & 1) m = (m*3+1)>>1; else m >>= 1; if(m > 100) continue; if(vis[m] == 2) break; if(vis[m] == 1) vis[m] = 2; } } int cnt = 0; for(int i = 0; i <= 100; i++) if(vis[i] == 1) key[cnt++] = i; sort(key, key+cnt, cmp); for(int i = 0; i < cnt-1; i++) printf(%d , key[i]); printf(%d , key[cnt-1]); } int main() { while(~scanf(%d, &n)) { memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++) { scanf(%d, &a[i]); vis[a[i]] = 1; } solve(); } return 0; }
?
?
#include1007 用筛法把100000以内素数都求出来#include using namespace std; int main() { int dig[3], n; while(~scanf(%d, &n)) { dig[0] = dig[1] = dig[2] = 0; int i = 0; while(n != 0) { dig[i++] = n%10; n /= 10; } if(dig[2] != 0) for(int i = 0; i < dig[2]; i++) printf(B); if(dig[1] != 0) for(int i = 0; i < dig[1]; i++) printf(S); if(dig[0] != 0) for(int i = 1; i <= dig[0]; i++) printf(%d, i); printf( ); } }
?
?
#include1008 不解释#include using namespace std; const int MAX_N = 100010; int prime[MAX_N]; bool is_prime[MAX_N+1]; int cnt = 0, n; void GetPrime() { for(int i = 0; i <= MAX_N; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for(int i = 2; i <= MAX_N; i++) if(is_prime[i]) { prime[cnt++] = i; for(int j = 2*i; j <= MAX_N; j += i) is_prime[j] = false; } } void solve() { int res = 0; for(int i = 1; i < cnt && prime[i] <= n; i++) if(prime[i]-prime[i-1] == 2) res++; printf(%d , res); } int main() { GetPrime(); while(~scanf(%d, &n)) solve(); return 0; }
?
?
#include1009 不解释#include using namespace std; int main() { int n, m, a[110]; while(~scanf(%d%d, &n, &m)) { m %= n; for(int i = 0; i < n; i++) scanf(%d, &a[i]); for(int i = n-m; i < n; i++) printf(%d , a[i]); for(int i = 0; i < n-1-m; i++) printf(%d , a[i]); printf(%d , a[n-1-m]); } return 0; }
?
?
#include1010 注意最后求得导数为0 的情况#include #include using namespace std; int main() { string str[100]; int n = 0; while(cin >> str[n++]) ; for(int i = n-2; i > 0; i--) cout << str[i] << ; cout << str[0] << endl; return 0; }
?
?
#include1011 long long就可以过#include using namespace std; int main() { //freopen(in.txt, r, stdin); bool flag = true; int a[1010], b[1010]; int n = 0; while(~scanf(%d, &a[n++])) ; int cnt = 0; for(int i = 0; i < n; i += 2) if(a[i] != 0 && a[i+1] != 0 ) { b[cnt++] = a[i]*a[i+1]; b[cnt++] = a[i+1]-1; } if(cnt == 0) printf(0 0 ); else { for(int i = 0; i < cnt-1; i++) printf(%d , b[i]); printf(%d , b[cnt-1]); } return 0; }
?
?
#include1012 注意每种数字个数为0的表示情况#include using namespace std; int main() { int t; long long a, b, c; scanf(%d, &t); for(int cas = 1; cas <= t; cas++) { scanf(%lld%lld%lld, &a, &b, &c); printf(Case #%d: , cas); if(a+b > c) printf(true ); else printf(false ); } return 0; }
?
?
#include1013 范围太大,依然用筛法,时间上有保证,但注意边界#include #include using namespace std; int main() { //freopen(in.txt, r, stdin); int A1, A2, A3, A5, c2, c4, c5, x, N; float A4; while(~scanf(%d, &N)) { int flag = 1; A1 = A2 = A3 = A5 = c2 = c4 = c5 = 0; A4 = 0; while(N--) { scanf(%d, &x); if(x % 5 == 0) { if(x % 2 == 0) A1 += x; } else if(x % 5 == 1) { A2 += flag*x; flag = -flag; c2++; } else if(x % 5 == 2) A3++; else if(x % 5 == 3) {A4 += x; c4++; } else if(x % 5 == 4) { if(A5 < x) A5 = x; c5++; } } if(A1 == 0) printf(N ); else printf(%d , A1); if(c2 == 0) printf(N ); else printf(%d , A2); if(A3 == 0) printf(N ); else printf(%d , A3); if(c4 == 0) printf(N ); else printf(%.1f , A4/c4); if(c5 == 0) printf(N ); else printf(%d , A5); } return 0; }
?
?
#include1014 注意顺序,还能不能好好的约会了!!!#include using namespace std; int prime[10010], n = 1; bool is_prime[105000]; void GetPrime() { for(int i = 0; i <= 105000; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for(int i = 2; i <= 105000; i++) if(is_prime[i]) { prime[n++] = i; for(int j = 2*i; j <= 105000; j += i) is_prime[j] = false; } } int main() { int N, M; GetPrime(); while(~scanf(%d%d, &N, &M)) { int cnt = 0; for(int i = prime[N]; i <= prime[M]; i++) { if(is_prime[i]) { if(cnt == 0) { printf(%d, i); cnt++; } else if(cnt < 9) { printf( %d, i); cnt++; } else { printf( %d , i); cnt = 0; } } } if((M-N+1)%10 != 0) printf( ); } return 0; }
?
?
#include#include #include using namespace std; char DAY[8][4] = {MON,TUE,WED,THU,FRI,SAT,SUN}; int main() { char s1[66], s2[66], s3[66], s4[66]; int day, hour, minute; while