Wednesday, July 19, 2017

PAT (Basic Level) Practise (中文) 1013

1013. 数素数 (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

//C++ Program
#include <iostream>
#include <cmath>
using namespace std;

bool is_prime(int n);

int main(void) {

 int M, N, num = 0;
 cin >> M >> N;

 for (int i = 2; num < N; ++i) {
  if (is_prime(i)) {
   ++num;
   if (num >= M) {
    cout << i;
    if ((num - M + 1) % 10 == 0) {
     cout << endl;
    } else if (num < N) {
     cout << " ";
    }
    else {
     cout << endl;
    }
   }
  }
  if (i > 2) {
   ++i;
  }
 }

 return 0;
}

bool is_prime(int n) {

 for (int i = 2; i <= sqrt(n); ++i) {
  if (n%i == 0) {
   return false;
  }
 }
 return true;

}

PAT (Basic Level) Practise (中文) 1012

1012. 数字分类 (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
  • A1 = 能被5整除的数字中所有偶数的和;
  • A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
  • A3 = 被5除后余2的数字的个数;
  • A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
  • A5 = 被5除后余4的数字中最大数字。
    输入格式:
    每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
    输出格式:
    对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
    若其中某一类数字不存在,则在相应位置输出“N”。
    输入样例1:
    13 1 2 3 4 5 6 7 8 9 10 20 16 18
    
    输出样例1:
    30 11 2 9.7 9
    
    输入样例2:
    8 1 2 4 5 6 7 9 16
    
    输出样例2:
    N 11 2 N 9
  • 
    
  • //C++ Program
    #include <iostream>
    #include <cstring>
    #include <iomanip>
    using namespace std;
    
    int main(void) {
    
     int N, num, sign = -1, count = 0;
     float A[5] = { 0, 0, 0, 0, 0};//利用数组比较方便,下标与题目略有不同
     bool exist[5];//检测各类数字是否存在
     memset(exist, false, 5);//初始化
     cin >> N;
    
     for (int i = 0; i < N; ++i) {
      cin >> num;
      switch (num % 5) {
      case 0:
       if (num % 2 == 0) {
        if (!exist[0]) {
         exist[0] = true;
        }
        A[0] += num;
       }
       break;
      case 1:
       if (!exist[1]) {
        exist[1] = true;
       }
       sign *= -1;
       A[1] += (sign*num);
       break;
      case 2:
       if (!exist[2]) {
        exist[2] = true;
       }
       ++A[2];
       break;
      case 3:
       if (!exist[3]) {
        exist[3] = true;
       }
       ++count;
       A[3] += num;
       break;
      case 4:
       if (!exist[4]) {
        exist[4] = true;
       }
       if (num > A[4]) {
        A[4] = num;
       }
      }
     }
    
     A[3] /= count;
    
     for (int i = 0; i < 5; ++i) {
      if (i > 0) {
       cout << " ";
      }
      if (exist[i]) {
       if (i == 3) {
        cout << fixed<<setprecision(1);//精确到小数点后1位
       }
       else {
        cout << fixed << setprecision(0);
       }
       cout << A[i];
      }
      else {
       cout << "N";
      }
     }
    
     cout << endl;
    
     return 0;
    }
  • Tuesday, July 18, 2017

    PAT (Basic Level) Practise (中文) 1011

    1011. A+B和C (15)

    时间限制
    150 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    HOU, Qiming
    给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
    输入格式:
    输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
    输出格式:
    对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
    输入样例:
    4
    1 2 3
    2 3 4
    2147483647 0 2147483646
    0 -2147483648 -2147483647
    
    输出样例:
    Case #1: false
    Case #2: true
    Case #3: true
    Case #4: false
    
    
    //C++ Program
    #include <iostream>
    using namespace std;
     
    int main(void) {
     
     int T;
     long long A, B, C;
     cin>>T;
     bool *b = new bool[T];
     
     for(int i=0;i<T;++i) {
      cin>>A>>B>>C;
      *(b+i) = A+B>C?true:false;
     }
     
     for(int i=0;i<T;++i) {
      cout<<"Case #"<<i+1<<": "<<boolalpha<<*(b+i)<<endl;//将bool值显示为“true”和“false”
     }
     
     return 0;
     
    }

    PAT (Basic Level) Practise (中文) 1010

    1010. 一元多项式求导 (25)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)
    输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
    输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
    输入样例:
    3 4 -5 2 6 1 -2 0
    
    输出样例:
    12 3 -10 1 6 0
    
    
    //C++ Program
    #include <iostream>
    #include <vector>
    using namespace std;
     
    int main(void) {
     
     int coef, expo;
     vector<int> v;
     
     while (cin>>coef>>expo) {
      int new_coef = coef*expo;
      if (new_coef!=0) {
       v.push_back(new_coef);
       v.push_back(expo-1);
      }
      if (cin.get()=='\n') {
       break;
      }
     }
     
     if (v.empty()) {
      v.push_back(0);
      v.push_back(0);
     }
     
     for(vector<int>::iterator it = v.begin();it!=v.end();++it) {
      if (it!=v.begin()) {
       cout<<" ";
      }
      cout<<*it;
     }
     cout<<endl;
     
     return 0;
    }