PAT《算法笔记》

3.5 进制转换

  • P进制转换为10进制
// y 为要求的 10进制数
// x 为 P 进制数,循环中每次取一位
// product 在循环中不断乘 P,得到 P 的幂次
int y = 0, product = 1;
while (x != 0){
    y = y + (x % 10) * product;
    x = x / 10;
    product = product * P;
}
  • 10进制转换为Q进制
// 数组 z 用来存放所求 Q进制数的每一位
// num 为 Q进制数的位数
int z[40], num = 0;
do {
    z[num++] = y % Q; // 除基取余法
    y = y / Q;
} while (y > 0);
// z 数组从 z[num-1] 到 z[0] 即为所求

 

第五章  数学问题

5.2 最大公约数与最小公倍数

 1 int gcd(int a, int b)   //求最大公约数的辗转相除法递归写法——【最小公倍数可用穷举法】
 2 {
 3     if(b == 0) return a;
 4     else return gcd(a, a % b);
 5 }
 6 
 7 int main()
 8 {
 9     int m, n;
10     while( scanf("%d%d", &m, &n ) != EOF){
11         printf("%d\n", gcd(m, n));
12     }
13     return 0;
14 }

 

5.3 分数的四则运算

struct Fraction{    //分数 
    int up, down;    //分子、分母 
}; 

 

5.4 素数

  • 素数判断
bool isPrime(int x)        //1既不是素数也不是合数
{
    if(x < 2) return false;
    for(int i = 2; i*i <= x; i++) if(x % 2 == 0) return false;
    return true;
}
  • 素数筛法【复杂度:O(nloglogn)】
const int maxn = 101;    //表长
int prime[maxn], num = 0;    //prime数组存放所有素数 num为素数个数 
bool p[maxn] = {0};    //如果 i为素数 p[i]为false 否则为true 
void find_Prime()
{
    for(int i = 2; i < maxn; i++)    //从2开始 i<maxn结束 注意不能写成i<=maxn 
    {
        if(p[i] == false)
        {
            prime[num++] = i;
            for(int j = i+i; j < maxn; j++) p[j] = true;    
        }    
    }    
} 

 

5.5 质因子分解

struct factor{
    int x, cnt;        //x为质因子 cnt为其个数 
}f[10]; 

if(n % prime[i] == 0)    //如果prime[i]是n的因子 
{
    f[num].x = prime[i];    //记录该因子 
    f[num].cnt = 0;
    while(n % prime[i] == 0)    // 计算出质因子prime[i]的个数 
    {
        f[num].cnt++;
        n /= prime[i];
    }
    num++;    //不同质因子个数加 1 
}

if(n != 1)    //如果无法被根号n以内的质数除尽 
{
    f[num].x = n;    //那么一定有一个大于根号n的质因子    
    f[num++].cnt = 1; 
} 

 

5.6 大整数运算

struct bignum{
    int num[1000];
    int len;
    bignum()//构造函数 
    {
        memset(num, 0, sizeof(num));//初始化结构体 
        len = 0; 
    }
};

字符串输入转数字分别存入数组,模拟高精度加减运算。

 

*5.7 扩展欧几里得算法

*5.8 组合数

//计算n!中有多少个质因子p
int cal(int n, int p)
{
    int ans = 0;
    while(n)
    {
        ans += n / p;    //累加n/p^k
        n /= p;    
    }    
    return ans;
} 

时间复杂度:O(logn)

 

 第六章  C++标准模板库(STL)

 

 

 

 

 

 

 

 

 

 

 

 

【所有代码必须手动模拟一遍,无论是函数功能模块还是完整程序】

 

posted @ 2020-08-25 19:30  $KAMISAMALZ  阅读(210)  评论(0编辑  收藏  举报