pat (basic level)题解

想要锻炼自己的代码能力,看自己能否用最简练的代码AC。下面开始:

1006

简单的字符转换没什么难度

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     cin >> n;
 6     int bai,shi,ge;
 7     bai = n / 100;
 8     shi = (n - bai * 100) / 10;
 9     ge = n % 10;
10     for(int i = 0; i < bai; i ++){
11         cout << 'B';
12     }
13     for(int i = 0; i < shi; i++){
14         cout << 'S';
15     }
16     for(int i = 0; i < ge; i++){
17         cout << i + 1;
18     }
19     return 0;
20 }

1007

这里主要是不要偷懒质数一定要循环到sqrt(n)才好,其次是要判定i+2有没有越界这是个坑要注意。

 1 #include<iostream>
 2 #include<math.h>
 3 using namespace std;
 4 bool check(int n){
 5     bool flag = true;
 6     for(int i = 2; i <= sqrt(n); i++){
 7         if(n % i == 0){
 8             flag = false;
 9             break;
10         }
11     }
12     return flag;
13 }
14 int main(){
15     int n;
16     cin >> n;
17     int sum = 0;
18     for(int i = 2; i < n; i++){
19         if(check(i)){
20             if(check(i + 2) && (i + 2) <= n) ++sum;
21         } 
22     }
23     cout << sum;
24     return 0;
25 }

1008逻辑移位,注意取模

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n, m;
 5     cin >>n >>m;
 6     int a[n];
 7     for(int i = 0; i < n; i++){
 8         cin >> a[i];
 9     }
10     int t = (-m % n) + n;
11     for(int i = 0; i < n; i++){
12         cout << a[((t + i) % n)];
13         if(i == n - 1) continue;
14         cout << " ";
15     }
16     return 0;
17 }

 1009 字符串处理,注意单行读入

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int main(){
 5     string s;
 6     string t;
 7     getline(cin,s);
 8     t = s;
 9     int length = t.length();
10     while(t.find(' ') >= 0 && t.find(' ') < length){
11         int pos = t.rfind(' ');
12         cout << t.substr(pos + 1) << ' ';
13         t = t.substr(0, pos);
14         length = pos - 1;    
15     }
16     cout << t;
17     return 0;
18 }

1010 难点在于无结束标志的数字读入

scanf("%d%d", &n, &e) != EOF
 1 #include<stdio.h>
 2 using namespace std;
 3 int main(){
 4     int n, e, flag = 0;
 5     while(scanf("%d%d", &n, &e) != EOF){
 6         if(n * e){
 7             if(flag){
 8                 printf(" ");
 9             }
10             else flag = 1;
11             printf("%d %d", n * e, e - 1);
12         }
13     }
14     if(!flag) printf("0 0");
15   return 0;  
16 }

1011 此题涉及大数字运算可以用long long来计算

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 using namespace std;
 4 int main(){
 5     int n;
 6     long long a, b, c;
 7     cin >> n;
 8     for(int i = 0; i < n; i++){
 9         cin >> a >> b >> c;
10         if(a + b > c) printf("Case #%d: true\n", i + 1);
11         else printf("Case #%d: false\n", i + 1);
12     }
13     return 0;
14     
15 }

 1012 简单的判断,考察浮点数的保留小数位数

 1 #include<iostream>
 2 #include <iomanip>
 3 using namespace std;
 4 int main(){
 5     int n;
 6     cin >> n;
 7     int x;
 8     int a[6] ={0};
 9     double a4sum = 0;
10     int sign = 1;
11     bool flag[6] = {true,true,true,true,true,true};
12     while(n--){
13         cin >> x;    
14         if(x % 10 == 0) {
15             a[1] += x;
16             flag[1] = false;
17         }
18         if(x % 5 == 1) {
19             a[2] += x * sign;
20             sign = -sign;
21             flag[2] = false;
22         }
23         if(x % 5 == 2){
24             flag[3] = false;
25             ++a[3];
26         } 
27         if(x % 5 == 3){
28             ++a[4];
29             a4sum += x;
30             flag[4] = false;
31         }
32         if(x % 5 == 4){
33             if(x > a[5]) a[5] = x;
34             flag[5] = false;
35         }
36     }
37     for(int i = 1; i <= 5; i++){
38         if(!flag[i]){
39             if(i == 4) cout << setprecision(1) << fixed << (a4sum / a[4]);
40             else cout << a[i];
41         }else{
42             cout << "N";
43         }
44         if(i != 5) cout << " ";
45     }
46     return 0;
47 }

1013 考察换行,没有难度

 1 #include<iostream>
 2 #include<math.h>
 3 using namespace std;
 4 bool check(int n){
 5     bool flag = true;
 6     for(int i = 2; i <= sqrt(n); i++){
 7         if(n % i == 0){
 8             flag = false;
 9             break;
10         }
11     }
12     return flag;
13 }
14 int main(){
15     int m, n;
16     cin >> m >> n;
17     int count = 0;
18     int i = 1;
19     while(count < n){
20         if(check(++i)){
21             ++count;
22             if(count >= m){
23                 if((count - m) % 10 != 0) cout << ' ';
24                 cout << i;
25                 if((count - m) % 10 == 9)cout <<endl;
26             }
27             
28         }
29     }
30 }

 1016.简单题,考察取位

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int a, da, b, db, pa, pb;
 5     cin >> a >> da >> b >>db;
 6     pa = 0;
 7     pb = 0;
 8     while(a != 0){
 9         if(a % 10 == da){
10             pa = pa * 10 + da;
11         }    
12         a /= 10;
13     }
14     while(b != 0){
15         if(b % 10 == db){
16             pb = pb * 10 + db;
17         }    
18         b /= 10;
19     }
20     cout << pa + pb;
21     return 0;
22 }

1017. 简单的除法模拟

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int main(){
 5     string a;
 6     int b;
 7     int index, left;
 8     int first,temp;
 9     cin >> a >> b;
10     first = 0;
11     temp = a[0] -'0';
12         first = temp / b;
13         left = temp % b;
14     if(a.size() == 1) cout << first;
15     else if(first != 0) cout << first;
16     for(int i = 1; i < a.size(); i++){
17         temp = left * 10 + (a[i] - '0');
18         cout << temp / b;
19         left = temp % b;
20     }
21     cout << ' ' << left;
22     return 0;
23 }

1019. 要用到简单的排序,注意首位有0的情况

 1 #include<iostream>
 2 using namespace std;
 3 int getmax(int a[]){
 4     for(int i = 1; i < 4; i++){
 5         for(int j = 0; j < i; j++){
 6             if(a[j] < a[i]) {
 7                 int n = a[j];
 8                 a[j] = a[i];
 9                 a[i] = n;
10             }
11         }
12     }
13     int result = 0;
14     for(int i = 0; i < 4; i++){
15         result = result * 10 + a[i];
16     }
17     return result;
18 }
19 int getmin(int a[]){
20     for(int i = 1; i < 4; i++){
21         for(int j = 0; j < i; j++){
22             if(a[j] > a[i]) {
23                 int n = a[j];
24                 a[j] = a[i];
25                 a[i] = n;
26             }
27         }
28     }
29     int result = 0;
30     for(int i = 0; i < 4; i++){
31         result = result * 10 + a[i];
32     }
33     return result;
34 }
35 void print(int n){
36     int a[4]={0};
37     for(int i = 3; i >= 0; i--){
38         a[i] = n % 10;
39         n /= 10;
40     }
41     for(int i = 0; i < 4; i++){
42         cout << a[i];
43     }
44 }
45 int main(){
46     int n = 0;
47     cin >> n;
48     int a[4] ={0};
49     int result;
50     result = -1;
51     while(result !=0 && result != 6174){
52         for(int i = 0; i < 4; i++){
53             a[i] = n % 10;
54             n /= 10;        
55         }
56         int max = getmax(a);
57         print(max);
58         cout << " - ";
59         int min = getmin(a);
60         print(min);
61         cout << " = ";
62         result = max - min;
63         print(result);
64         cout << endl;
65         n = result;
66     }
67 
68 }

1022.简单的取余运算,注意基数为0的情况

 1 #include<iostream>
 2 using namespace std;
 3 void F(long long  n,int m)
 4 {
 5  int a[10000];
 6  int index  = 0;
 7  while(n != 0){
 8      a[index++] = n % m;
 9      n = n / m;
10  }
11  for(int i = index - 1; i >= 0; i--){
12      cout << a[i];
13  }
14  return ;
15 }
16 int main(){
17     long long n,m;
18     int base;
19     cin >> n >> m >> base;
20     if(n == 0 || m ==0) cout << 0;
21     else F(n + m,base);
22 }

 

posted @ 2014-09-02 18:12  长安剑客  阅读(210)  评论(0)    收藏  举报