本文对PAT中常见数学问题用到的模板进行了演绎:

1.最大公约数与最小公倍数

int gcd(int a, int b){//求取最大公约数    return !b ? a : gcd(b, a%b);}int lcm(int a, int b){//求取最小公倍数    return a / gcd(a,b) * b;    //先除后乘以防止溢出}

2.分数

//留神,个别分数的分子分母用long long示意更保险,因为有时做运算时会导致int溢出struct Fraction{//分数    int up, down;   //分子与分母};Fraction reduction(Fraction result){//分数化简    if(result.down < 0){        result.up = - result.up;        result.down = -result.down;    }    if(!result.down)    result.up = 1;    else{        int d = gcd(abs(result.up), abs(result.down));  //留神此处应用绝对值来求取最大公约数        result.up /= d;        result.down /= d;    }    return result;}void showResult(Fraction r){//分数输入    r = reduction(r);    if(r.down == 1) printf("%d", r.up);    else if(abs(r.up) > r.down)        printf("%d %d/%d", r.up/r.down, abs(r.up)%r.down, r.down);    else        printf("%d/%d", r.up, r.down);}

3.素数

bool is_prime(int n){//判断素数    if(n <= 1)  return false;    int sqrn = (int)sqrt(1.0 * n);    for(int i = 2; i <= sqrn; i++){//记住是从2开始,并且前面是小于等于号        if(n % i == 0)  return false;    }    return true;}